如何使用java

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

但是,当在这个时区中遵循日光节省时,我的代码不会打印正确的时间(它少打印1小时)。

如何使代码始终读取正确的时间,无论是否观察到日光储蓄?
PS:我尝试将时区设置为EDT,但不能解决问题。
    

这个问题是:

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

应全心全意地避免使用3个字母的缩写,以支持TZDB区域ID。 EST是东部
java date calendar timezone
5个回答
120
投票
标准时间永远不会观察到DST;这并不是真正的全职区域名称。这是时区域的

part

使用的名称。 (不幸的是,我没有遇到这个“半时区域”概念的好任期。)
您想要一个时区名称。例如,
America/New_York

在东部时区: TimeZone zone = TimeZone.getTimeZone("America/New_York"); DateFormat format = DateFormat.getDateTimeInstance(); format.setTimeZone(zone); System.out.println(format.format(new Date())); 其他答案是正确的,尤其是jonskeet

,但已过时。

java.Time 这些旧的日期课程已由java 8及以后的

java.Time
框架取代。

如果您只想在UTC中使用当前时间,请使用
Instant
类。

27
投票
正如乔恩·斯基特(JonSkeet

)在正确的答案中所解释的那样,不是时区。这样的3-4个字母代码既不是标准化也不独特,也进一步避免了日光保存时间(DST)。在“大陆/区域”格式中使用Proper时区名称

也许您的意思是北美东海岸的东部标准时间?还是埃及标准时间?还是欧洲标准时间?

EST 使用任何这样的对象,以使当前矩调整到特定时区以产生

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

对象。

ZoneId
从第一个开始产生另一个ZonedDateTime对象,将ZonedDateTime划分为不同的时区。 Java.Time Framework使用
Mmutable对象

而不是更改(突变)现有对象。

ZonedDateTime

即将输入“ EST”的时区,您可以输入“ EST5EDT”。正如您指出的那样,“ EDT”不起作用。这将解释日光储蓄时间问题。代码线看起来像这样:

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

    
AS Per this
Answer

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

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

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

Table of date-time types in Java, both modern and legacy. 在java,默认情况下使用DST,为了避免节省日光(DST),您需要手动做一个技巧,

首先,您必须获得dst偏移量,即应用多少毫秒DST,因为ex在某个地方也持续45分钟,在某些地方,它是30分钟

4
投票
您必须使用时区对象,并检查其是否属于DST的日期,然后必须手动将DST添加到其中。例如:

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; }
    

1
投票
实现时区类以将时区设置为日历,请保存日光。

Java.util.TimeZone代表时区偏移,还可以弄清日光节省。 样本代码:

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; }
    

1
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.