我必须打印EST时在我的Java应用程序。 我已经设定时区使用EST:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
但是,当夏令被跟随在这个时区,我的代码不会打印正确的时间(它打印1小时以下)。
如何使代码工作总是读取正确的时间,不论是否被观察到的夏令与否?
PS:我尝试了时区设置为EDT,但它并没有解决问题。
我必须打印EST时在我的Java应用程序。 我已经设定时区使用EST:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
但是,当夏令被跟随在这个时区,我的代码不会打印正确的时间(它打印1小时以下)。
如何使代码工作总是读取正确的时间,不论是否被观察到的夏令与否?
PS:我尝试了时区设置为EDT,但它并没有解决问题。
这是开始的问题:
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()));
其他的答案是正确的,尤其是在一个由乔恩斯基特 ,但已经过时。
这些旧日期,时间类已被取代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" ) ) ;
相反,进入“EST”的时区,你可以输入“EST5EDT”本身。 正如你指出的,只是“EDT”不起作用。 这将占到日光节约时间的问题。 该行代码如下所示:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));
按照这个答案 :
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
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;
}
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中,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
}
实施TimeZone类设置时区到日历采用夏令时的照顾。
java.util.TimeZone中表示时区偏移量,也可以计算夏令时。
示例代码:
TimeZone est_timeZone = TimeZoneIDProvider.getTimeZoneID(TimeZoneID.US_EASTERN).getTimeZone();
Calendar enteredCalendar = Calendar.getInstance();
enteredCalendar.setTimeZone(est_timeZone);