如何将时间和日期从UTC转换为EST,而不用担心夏令时(DST)



我有一个服务,它需要日期和时间的数据,我从我的数据库收集。数据库中的数据按照UTC时区存储。现在我想从数据中获取这些数据并在时区中呈现给用户无论它是在哪个时区,或者只是时间数据和数据按照系统默认时区。就像现在我有一些硬编码的东西,如果日光节约时间改变,它会做出改变例如,当DST开始时,它从系统中的数据中减去4小时(按照东部夏令时),如果DST结束,我必须手动将减去的小时更改为5小时(按照东部夏令时),并将其呈现给用户。

我正在做下面的事情

这里我使用

  1. Date from java.util.Date

  2. getObtainedDate用于从数据库获取数据

  3. 我添加了这个减号,以便它将从日期中减去该时间。

    Instant ins = attachment.getObtainedDate().toInstant();Ins = Ins。-(5、Chronounit.HOURS);//不使用夏令时Date alteredDate = Date.from(ins);

    Instant ins = attachment.getObtainedDate().toInstant();Ins = Ins。- (4, ChronoUnit.HOURS);//夏令时期间Date alteredDate = Date.from(ins);

我想摆脱这个硬编码的东西,因为我必须手动更改5和4每当DST开始和结束。

提前谢谢你

br

你说:

来自数据库的时间和日期数据,其时间存储在UTC时区

你说:

从UTC到EST而不用担心夏令时

myResultSet
.getObject( … , OffsetDateTime.class )                  // Returns a `OffsetDateTime` object, the appropriate class mapping to the standard SQL type `TIMESTAMP WITH TIME ZONE`. 
.atZoneSameInstant( ZoneId.of( "America/New_York" ) )   // Returns a `ZonedDateTime` object. 

如果交给一个有严重缺陷的遗留类java.util.Date的对象,立即转换为它的现代替换类java.time.Instant。使用添加到旧类的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;
ZonedDateTime zdt = instant.atZone( ZoneId.systemDefault() ) ;
<标题>

详细信息你的问题令人困惑和费解。你可能太努力了。

你说:

数据库中的时间和日期数据,其时间存储在UTC时区

如果你的数据库将时刻存储为一个日期,时间与UTC的时差为0小时-分钟-秒,那么你的数据库表列必须是类似于标准SQL类型TIMESTAMP WITH TIME ZONE的类型。如果是这样,您应该使用Java类型OffsetDateTime进行检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

你说:

当DST开始时,我收集的数据应该开始减去

如果您想通过特定时区的时钟时间查看同一时刻,请应用ZoneId来获得ZonedDateTime对象。

注意EST不是一个真实的时区名称。也许你指的是America/New_York

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

如果您想使用JVM当前的默认时区:

ZoneId z = ZoneId.systemDefault() ;

你说:

我正在做下面的操作

Instant ins =

Instant表示UTC的时刻,总是在UTC。但是这个类不映射到任何标准SQL类型。使用OffsetDateTime与数据库交换一个时刻(时间轴上的特定点)。

你说:

Date alteredDate = Date.from(ins);

对于Date类,java.util.Date&java.sql.Date: (a)我不知道你的意图是什么,(b)两者都不应该使用。两个Date类都有严重的缺陷,现在是遗留的,被现代的java所取代。时间类。

你说:

应该开始从EST中的时间减去4小时,DST偏移量是-400,当它结束时应该减去5小时

你不需要做数学计算。无需跟踪夏时制转换日期。

  • 用UTC(偏移量为0)完成日志记录、调试、数据存储、数据交换和大多数业务逻辑。
  • 应用时区仅用于向用户展示,并且在业务逻辑中的特定规则要求时。

通过使用ZoneIdZonedDateTime类,DST切换和调整为您处理。

我设法按照系统使用此代码的时区获取时间。

此代码还可以根据时区更改偏移量。

我在这里使用

  1. Date from java.util.Date
  2. ZonedDateTime from java.time.ZonedDateTime
  3. DateTimeFormatter from java.time.DateTimeFormatterjava.time.Instant

解决这个问题的代码

Date date = attachment.getObtainedDate();  // for getting the date in the system
// Here I m setting the zone to system default
ZoneId zoneId = ZoneId.systemDefault();    // for setting the zoneId as per the location you want
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(date.getTime()).atZone(zoneId);
// for formatting date and time
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm");
String requiredDate = zonedDateTime.format(dtf);

如果要在调试时检查时区的偏移量以获取更多信息,可以在

代码中再添加一行
ZoneOffset offset = zonedDateTime.getOffset();

最新更新