在没有夏令时调整的情况下执行日期运算

问题描述 投票:0回答:1

我想从纽约时区的字符串中解析日期,添加 1 天,然后输出字符串。

喜欢:

  1. 解析到日期
  2. 增加1天
  3. 输出

问题是,当我在调整夏令时期间解析日期时,步骤 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 date simpledateformat
1个回答
0
投票

java.time

我建议您避免使用过时的

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

在线演示

Trail:日期时间

了解现代日期时间 API
© www.soinside.com 2019 - 2024. All rights reserved.