我想从纽约时区的字符串中解析日期,添加 1 天,然后输出字符串。
喜欢:
问题是,当我在调整夏令时期间解析日期时,步骤 1 中的那一天已经有额外的小时,当我添加 1 天时,第二天将有额外的小时,这对于第二天来说是错误的,到期的第二天不是夏令时调整发生的日子。
示例:
输入日期3月10日凌晨2点
解析日期:3 月 10 日凌晨 3 点
添加 1 天 => 3 月 11 日凌晨 3 点 // 必须是 3 月 11 日凌晨 2 点
但是如果直接解析3月11日凌晨2点,那么就是正确的:
输入日期3月11日凌晨2点
解析日期 => 3 月 11 日凌晨 2 点
所以,我需要解析一个日期,添加 1 天,然后才执行智能调整:
输入日期3月10日凌晨2点
解析日期:3 月 10 日凌晨 2 点 //别在这里聪明,还是凌晨 2 点
添加 1 天 => 3 月 11 日凌晨 2 点 // 这里您可以聪明地根据需要调整夏令时
此代码不正确,显示的是 3 月 11 日上午 7 点,而不是上午 6 点
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class MainApp {
public static void main(String[] args) {
try {
SimpleDateFormat in = new SimpleDateFormat("yyyyMMdd-HH.mm");
in.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date date = in.parse("20240310-02.00");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_YEAR, 1);
date = calendar.getTime();
System.out.println(in.format(date)); // prints 20240311-03.00, but has to be 20240311-02.00
//parse 11 march directly, works ok
Date date2 = in.parse("20240311-02.00");
System.out.println(in.format(date2)); // prints 20240311-02.00
} catch (ParseException e) {e.printStackTrace();}
}
}
我建议您避免使用过时的
java.util
日期/时间 API,而使用 现代日期/时间 API、java.time
。
您给定的日期时间字符串没有时区信息。因此,您应该将其解析为
LocalDateTime
实例。
演示:
public class Main {
public static void main(String[] args) {
String strDateTime = "20240310-02.00";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd-HH.mm", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
LocalDateTime nextDate = ldt.plusDays(1);
System.out.println(ldt);
System.out.println(nextDate);
}
}
输出:
2024-03-10T02:00
2024-03-11T02:00