有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

时区之间的java转换给出了不正确的结果

 DateTime dt = new LocalDateTime(rs.getTimestamp("LastUpdated").getTime()).toDateTime(DateTimeZone.forID("America/New_York")); 

Timestamp t=new Timestamp(dt.getMillis());     

我从中得到的结果与“美国/纽约”的实际时间不符。它被关闭了几个小时。可能是什么问题

更新-

这是我想要转换的时间,它来自DB:2015-04-28 13:14:31这是转换的时间(从代码中删除“dt.plusMillis(offset)”后的代码输出):2015-04-28 22:44:31.0这是实际的纽约时间:凌晨3:45


共 (2) 个答案

  1. # 1 楼答案

    使用JODA library很容易做到这一点。核心java库非常痛苦,不建议使用它们。然而,日期和时间库已经用Java8重新实现

    让我们举个例子,假设您尝试将澳大利亚墨尔本时间转换为马德里时间

    这是Joda代码

        LocalDateTime dateTime = new LocalDateTime(2015, 3, 28, 14, 0, 0); 
        DateTime srcDateTime = dateTime.toDateTime(DateTimeZone.forID("Asia/Colombo"));
        DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID("America/New_York"));
        Date madridTime =dstDateTime.toLocalDateTime().toDateTime().toDate();
    
    
        System.out.println("Asia/Colombo -> "+srcDateTime.toDateTime());
        System.out.println("America/New_York -> "+madridTime);
    

    以下是输出:

    Asia/Colombo -> 2015-04-28T14:00:00.050+05:30
    America/New_York -> Tue Apr 28 04:30:00 EEST 2015
    

    您也可以从http://www.timezoneconverter.com/进行检查

    enter image description here

    另请参见:

    Date and Time API for JDK 8

  2. # 2 楼答案

    tl;博士

    myResultSet
    .getObject( … , OffsetDateTime.class )   // Returns a `OffsetDateTime` object represent a moment as seen through some offset-from-UTC, a number of hours-minutes-seconds ahead/behind UTC. 
    .atZoneSameInstant(                      // Adjusts from a moment with a mere offset to a moment as seen in a time zone.
        ZoneId.of( "America/New_York" )
    )
    

    维护模式下的Joda时间

    仅供参考,Joda-Time项目现在位于maintenance mode,建议迁移到java.time

    LocalDateTime不是一个时刻

    LocalDateTime类(在Joda Time和java.Time中)不代表一个时刻,而不是时间线上的一个点。该类通常不用于商业应用程序,除了(a)未来的预约,以及(b)表示可以应用于任何地点但不适用于特定地点的日期和时间

    避免java.sql.Timestamp

    显然,您是从ResultSet检索到一个java.sql.Timestamp对象的。停止这样做

    OffsetDateTime

    这个糟糕的类在几年前被java所取代。时间类,特别是与JDBC4.2及更高版本一起使用时的^{}

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

    ZonedDateTime

    要查看此moment in the New York区域的时区,请应用^{}获取^{}对象

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

    相同的时刻,时间线上相同的同时点,不同的挂钟时间

    清楚偏移和分区之间的区别:

    • Offset-from-UTC
      仅仅是小时分秒数。正面表示领先UTC(向东),负面表示落后UTC(向西)
    • Time zone
      一个时区是更多的时区。时区是过去、现在和未来(计划)对特定地区的人们使用的偏移量的变化的历史

    Table of date-time types in Java (both legacy and modern) and in standard SQL.


    关于java。时间

    java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如^{}^{}、&^{}

    要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

    现在位于maintenance modeJoda-Time项目建议迁移到java.time

    您可以交换java。时间对象直接与数据库连接。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*

    在哪里可以获得java。时间课

    ThreeTen-Extra项目扩展了java。额外上课的时间。这个项目是将来可能添加到java的一个试验场。时间您可以在这里找到一些有用的类,例如^{}^{}^{}more