但是,当在这个时区中遵循日光节省时,我的代码不会打印正确的时间(它少打印1小时)。
如何使代码始终读取正确的时间,无论是否观察到日光储蓄?PS:我尝试将时区设置为EDT,但不能解决问题。
这个问题是:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
应全心全意地避免使用3个字母的缩写,以支持TZDB区域ID。 EST是东部
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
类。
)在正确的答案中所解释的那样,不是时区。这样的3-4个字母代码既不是标准化也不独特,也进一步避免了日光保存时间(DST)。在“大陆/区域”格式中使用Proper时区名称
。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());
首先,您必须获得dst偏移量,即应用多少毫秒DST,因为ex在某个地方也持续45分钟,在某些地方,它是30分钟
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;
}
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;
}