如何在Java中使用的时区,以解决夏令时如何在Java中使用的时区,以解决夏令时(How to ta

2019-05-14 00:00发布

我必须打印EST时在我的Java应用程序。 我已经设定时区使用EST:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

但是,当夏令被跟随在这个时区,我的代码不会打印正确的时间(它打印1小时以下)。

如何使代码工作总是读取正确的时间,不论是否被观察到的夏令与否?

PS:我尝试了时区设置为EDT,但它并没有解决问题。

Answer 1:

这是开始的问题:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

三字母缩写须对TZDB区ID来全心全意避免。 EST是东部标准时间-与标准时间从来没有观察DST; 它不是一个真正的全时区名称。 这是用于时区的部分名称。 (不幸的是我还没有碰到过个好词,这个“半时区”的概念。)

你想有一个完整的时区名。 例如, America/New_York在东部时区:

TimeZone zone = TimeZone.getTimeZone("America/New_York");
DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(zone);

System.out.println(format.format(new Date()));


Answer 2:

其他的答案是正确的,尤其是在一个由乔恩斯基特 ,但已经过时。

java.time

这些旧日期,时间类已被取代java.time内置到Java 8和更高版本的框架。

如果你只是想在UTC当前时间,使用Instant类。

Instant now = Instant.now();

EST是不是一个时区,如解释由乔恩斯基特正确答案 。 这样3-4字母代码既不是标准化的,也不唯一的,并且进一步在夏令时间(DST)的混乱。 在“大陆/地区”格式使用适当的时区名称。

也许你在北美的东海岸意味着东部标准时间? 或埃及标准时间? 或欧洲标准时间?

ZoneId zoneId = ZoneId.of( "America/New_York" );
ZoneId zoneId = ZoneId.of( "Africa/Cairo" );
ZoneId zoneId = ZoneId.of( "Europe/Lisbon" );

使用任何这样ZoneId对象来获得调整到一个特定的时间段产生的电流瞬间ZonedDateTime对象。

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

通过产生从第一另一ZonedDateTime对象调整该ZonedDateTime到不同的时区。 该java.time框架使用不可改变的对象 ,而不是改变(突变)现有的对象。

ZonedDateTime zdtGuam = zdt.withZoneSameInstant( ZoneId.of( "Pacific/Guam" ) ) ;


Answer 3:

相反,进入“EST”的时区,你可以输入“EST5EDT”本身。 正如你指出的,只是“EDT”不起作用。 这将占到日光节约时间的问题。 该行代码如下所示:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));


Answer 4:

按照这个答案 :

TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());


Answer 5:

public static float calculateTimeZone(String deviceTimeZone) {
    float ONE_HOUR_MILLIS = 60 * 60 * 1000;

    // Current timezone and date
    TimeZone timeZone = TimeZone.getTimeZone(deviceTimeZone);
    Date nowDate = new Date();
    float offsetFromUtc = timeZone.getOffset(nowDate.getTime()) / ONE_HOUR_MILLIS;

    // Daylight Saving time
    if (timeZone.useDaylightTime()) {
        // DST is used
        // I'm saving this is preferences for later use

        // save the offset value to use it later
        float dstOffset = timeZone.getDSTSavings() / ONE_HOUR_MILLIS;
        // DstOffsetValue = dstOffset
        // I'm saving this is preferences for later use
        // save that now we are in DST mode
        if (timeZone.inDaylightTime(nowDate)) {
            Log.e(Utility.class.getName(), "in Daylight Time");
            return -(ONE_HOUR_MILLIS * dstOffset);
        } else {
            Log.e(Utility.class.getName(), "not in Daylight Time");
            return 0;
        }
    } else
        return 0;
}


Answer 6:

private static Long DateTimeNowTicks(){
    long TICKS_AT_EPOCH = 621355968000000000L;
    TimeZone timeZone = Calendar.getInstance().getTimeZone();
    int offs = timeZone.getRawOffset();
    if (timeZone.inDaylightTime(new Date()))
        offs += 60 * 60 * 1000;
    return (System.currentTimeMillis() + offs) * 10000 + TICKS_AT_EPOCH;
}


Answer 7:

在java中,DateFormatter默认使用DST,为了避免夏令时(DST),您需要手动执行一招,
首先你要获得DST即抵消了多少毫秒DST应用,为前某处DST也是45分钟,有些地方是30分钟
但在大多数情况下,DST是1小时
你必须使用对象的时区与日期检查是否DST在下降或没有,然后你必须手动添加偏移DST的进去。 对于例如:

 TimeZone tz = TimeZone.getTimeZone("EST");
 boolean isDST = tz.inDaylightTime(yourDateObj);
 if(isDST){
 int sec= tz.getDSTSavings()/1000;// for no. of seconds
 Calendar cal= Calendar.getInstance();
 cal.setTime(yourDateObj);
 cal.add(Calendar.Seconds,sec);
 System.out.println(cal.getTime());// your Date with DST neglected
  }


Answer 8:

实施TimeZone类设置时区到日历采用夏令时的照顾。

java.util.TimeZone中表示时区偏移量,也可以计算夏令时。

示例代码:

TimeZone est_timeZone = TimeZoneIDProvider.getTimeZoneID(TimeZoneID.US_EASTERN).getTimeZone();
Calendar enteredCalendar = Calendar.getInstance();
enteredCalendar.setTimeZone(est_timeZone);


文章来源: How to tackle daylight savings using TimeZone in Java