700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java timezone 107_java - Java使用TimeZone - 堆栈内存溢出

java timezone 107_java - Java使用TimeZone - 堆栈内存溢出

时间:2018-06-07 13:24:58

相关推荐

java timezone 107_java - Java使用TimeZone - 堆栈内存溢出

我在使用TimeZone时遇到麻烦,需要帮助。

背景:我有2个办事处,巴黎1个,纽约1个。 我都需要执行一些任务。 我唯一的服务器位于巴黎。 任务必须在当地时间9:00 AM执行。

因此,在巴黎时间9:00,我的流程将运行并完成巴黎办公室的所有工作。

在巴黎时间15:00(或3:00 PM),流程将再次运行以完成纽约任务,因为在巴黎的3:00 PM时,纽约的9:00 AM。

我尝试了以下类似的方法,但是成功减轻了:

Entity e1 = Entity.getEntityInstance("Paris", TimeZone.getTimeZone("Europe/Paris"));

Entity e2 = Entity.getEntityInstance("NewYork", TimeZone.getTimeZone("America/New_York"));

Date now = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

sdf.setTimeZone(e1.getTimeZone());

sdf.format(now);

System.out.printf("Date à %s = %s", e1.getName(), sdf.getCalendar());

sdf.setTimeZone(e2.getTimeZone());

sdf.format(now);

System.out.printf("Date à %s = %s", e2.getName(), sdf.getCalendar());

我得到的结果是这样的:

Date à Paris = java.util.GregorianCalendar[time=1563224081926,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=196,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=10,**HOUR_OF_DAY=22,MINUTE=54,SECOND=41**,MILLISECOND=926,ZONE_OFFSET=3600000,DST_OFFSET=3600000]

Date à NewYork = java.util.GregorianCalendar[time=1563224081926,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=196,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,**HOUR_OF_DAY=16,MINUTE=54,SECOND=41**,MILLISECOND=926,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]

我实际上可以看到HOUR_OF_DAY的差异,但是对于未弃用的对象(如DateTime (乔达时间)或其他任何东西),我应该怎么做才能得到相同的结果?

编辑

我尝试了在这里找到的东西 :

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );

Instant instant = zdt.toInstant();

我认为这可能是解决我的问题的方法,因为实际上,我想要获得的是代表2个即时但在2个不同位置的2个Date对象。

我所做的是:

ZonedDateTime zdt1 = ZonedDateTime.now( ZoneId.of(e1.getTimeZone().getID()));

ZonedDateTime zdt2 = ZonedDateTime.now( ZoneId.of(e2.getTimeZone().getID()));

System.out.println("ZDT : " + zdt1);

System.out.println("ZDT : " + zdt2);

结果引人入胜:

ZDT : -07-16T01:23:29.344+02:00[Europe/Paris]

ZDT : -07-15T19:23:29.346-04:00[America/New_York]

但是,当我尝试将它们转换为Instant然后转换为Date ,结果是一样的:

Instant i1 = zdt1.toInstant();

Instant i2 = zdt2.toInstant();

System.out.println(i1);

System.out.println(i2);

Date dd1 = Date.from(i1);

Date dd2 = Date.from(i2);

System.out.println(dd1);

System.out.println(dd2);

在控制台中:

Instant 1 = -07-15T23:23:29.344Z

Instant 2 = -07-15T23:23:29.346Z

Date 1 = Tue Jul 16 01:23:29 CEST

Date 2 = Tue Jul 16 01:23:29 CEST

我真的不明白2个不同的ZonedDateTime如何可以产生相同的Instant和Date ……

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。