java - 获取 23 :00 of the previous day when converting LocalDate to Timestamp

标签 java timestamp jodatime

我最近从 Calendar 切换到 joda time LocalDate 以避免我的项目中出现时区问题(我在那里不需要时区)。在某些时候,我需要从 LocalDate 获取时间戳:

  class DateTimeUtils{
   static Timestamp getDeadline(LocalDate localDate, int daysToAdd){
      localDate = localDate.plusDays(daysToAdd);
      System.out.println(localDate);//This prints 2017-06-02
      return new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());         
   }
  public static void main(String... args){
     LocalDate localDate= new LocalDate(2017,5,31);
     Timestamp timeStamp=getDeadline(localDate,2);
     System.out.println(timeStamp);//This prints 2017-06-01 23:00:00.0
  }
 }

不知为何,将localdate转换为timestamp后,结果回落到前一天的23:00。这是为什么?

最佳答案

时区很重要

to avoid timezone issues in my project

您不能忽视时区问题。一厢情愿的梦想。勇敢一点,不畏艰险,接受学习处理时区的挑战。你的编程工作会轻松很多。

在您调用 toDateTimeAtStartOfDay 时,您选择省略时区参数,DateTimeZone 对象。因此,在运行时,JVM 当前的默认时区被隐式应用。

然后您转换为始终采用 UTC 的 java.sql.Timestamp(显然 – 您没有明确说明包)。

您没有提供您的运行时当前默认时区,所以我无法提供更准确的细节。

使用java.time

Joda-Time 项目现在处于维护模式,其团队建议迁移到 java.time 类。这两个项目都由同一个人 Stephen Colebourne 领导,因此他们共享相同的概念方法。非常容易切换。

要获取今天的日期,请指定时区。对于任何给定时刻,日期在全局范围内因地区而异。

看看我们如何将区域传递给 atStartOfDay

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z );
LocalDate twoDaysLater = today.plusDays( 2 ) ;
ZonedDateTime zdt = twoDaysLater.atStartOfDay( z ) ;
Instant instant = zdt.toInstant();  // Instant is always in UTC by definition. 

使用 JDBC 4.2 及更高版本,您可以直接使用 java.time 类型。调用 PreparedStatement.setObjectResultSet.getObject


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 获取 23 :00 of the previous day when converting LocalDate to Timestamp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44071267/

相关文章:

java - 如何在java中克隆对象

带有 WHERE CLAUSE 的 TIMESTAMPDIFF 函数的 MySQL AVG

javascript - 隐藏特定时间的YouTube API元素

java - 保留时区信息的 ISO8601 到 DateTime

java - 智能卡和 p12 文件创建

java - AWS 免费套餐使用

java - 从文本文件 : not all data stored, 创建嵌套 HashMap 可能会被覆盖

java - 在 Java 中将本地时间戳转换为 UTC 时间戳

java - 使用 Joda Time 将 Unix 时间戳转换为字符串

java - 将 DateTime 转换为时区,设置时间并转换回来