日历不应使用夏令时

时间:2018-08-08 16:36:50

标签: java

我正在编写的程序正在将十六进制值转换为十进制值。十进制值表示自2010年1月1日以来的时间(以秒为单位)。我正在使用Calendar方法将秒数添加到日期中以获得最终的日期/时间。当我调用.useDaylightTime()时,它返回false,但如果使用的是DST,我得到的值是。我在俯视什么吗?

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
import java.util.TimeZone;

public class timeSince {

    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String hex = input.nextLine();
        TimeZone zone = TimeZone.getTimeZone("EST");
        System.out.println(zone.useDaylightTime());
        Calendar cal = Calendar.getInstance(zone);
        cal.set(2010, 0, 1, 0, 0, 0);
        cal.add(Calendar.SECOND, Integer.parseInt(hex,16));
        Date newDate = cal.getTime();
        System.out.println(dateFormat.format(newDate));

    }

}

2 个答案:

答案 0 :(得分:1)

用于格式化的时区在DateFormat上设置。

dateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
System.out.println(dateFormat.format(newDate));

答案 1 :(得分:1)

k5_ said一样,SimpleDateFormat所使用的时区与Calendar不在同一时区。因此,格式化时,JVM系统时区与用于创建EST的{​​{1}}之间的差异会添加到Calendar中。您最有可能处于newDate时区。该时区当前正在观察夏令时,因此当您打印America/New_York时,将看到夏令时的值。

newDate不是有效的时区,EST将失败。 ZoneId.of("EST")只是EST的非DST一半,另一半是America/New_York。要正确处理DST更改,请使用EDT

使用America/New_York

可以避免所有这些问题
java.time