当前位置: 首页 > 知识库问答 >
问题:

将LocalDate转换为时间戳时获取前一天的23:00

陈文景
2023-03-14

我最近从日历切换到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转换为时间戳后,结果会返回到前一天的23:00。为什么?

共有2个答案

林泰平
2023-03-14

您是否尝试过使用新的Java8日期时间API?它允许轻松地与java等遗留类进行互操作。sql。时间戳。下面的代码给出了JDK 8java的预期结果。时间课程。

public class DateTimeUtils {
    static Timestamp getDeadline(LocalDate localDate, int daysToAdd) {
        localDate = localDate.plusDays(daysToAdd);
        return Timestamp.valueOf(localDate.atStartOfDay());
    }

    public static void main(String... args) {
        LocalDate localDate = LocalDate.of(2017, 5, 31);
        Timestamp timestamp = getDeadline(localDate, 2);
        System.out.println(timestamp);// This prints 2017-06-02 00:00:00.0
    }
}
章昊
2023-03-14

在我的项目中避免时区问题

你不能忽视时区问题。一厢情愿的梦想。勇敢一点,抓住牛角,接受挑战,学会应对时区。你的编程工作会容易得多。

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

然后转换成java。sql。时间戳(显然,您没有明确说明软件包),始终使用UTC。

您没有提供运行时当前的默认时区,因此我无法更准确地描述细节。

Joda-Time项目现在处于维护模式,其团队建议迁移到java.time类。这两个项目都是由同一个人斯蒂芬·科尔伯恩领导的,所以他们有着相同的概念方法。很容易切换。

若要获取今天的日期,请指定时区。在任何给定的时刻,日期都因地区而异。

查看我们如何在StarTofDay将区域传递到

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。时间类型。调用PreparedStatement。setObject结果集。getObject

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

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

你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql* 类。

在哪里获得java.time类?

  • JavaSE8、JavaSE9及更高版本
    • 内置的
    • 标准Java API的一部分,带有捆绑实现
    • Java9增加了一些小功能和修复
    • java的大部分内容。时间功能被重新移植到Java 6
    • 更高版本的Android捆绑包实现了java。时间课

    额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

 类似资料:
  • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我想转换格式的时间戳记,并把它变成像用PHP。 我找到了一个有用的脚本来执行此操作,但是我认为它正在寻找一种不同的格式用作时间变量。我要修改以使用此格式的脚本是: 我认为在脚本的前几行中,脚本正在尝试执行以下操作(不同的日期格式数学): 我如何将时间戳转换为该(unix?

  • 我尝试了convert_timezone('CET',current_timestamp)函数,但它在AWS Athena中不被识别 在更简单的工作中,我在Presto中寻找SQL Server函数GETUTCDATE()的替代品,只是希望获得CET时间戳。有什么建议吗?

  • 问题内容: 我有一个表,该表在sqlite3中有一个带有时间戳的列。默认为,这样当插入行时,将插入当前时间。现在,我试图获取两天或更早之前插入的行。我想知道这是否有意义。 阅读我想到的文档: 但是显然那是错误的。我提出此查询,是因为它类似于我在实际代码中进行测试的方式: 。 但是我希望sqlite3包含一些针对这种情况的内置检查。 谢谢,我感谢您的任何答复。 编辑 :弄清楚了: 如果有人能提出更好

  • 问题内容: 我将时间作为Unix时间戳存储在MySQL数据库中,并将其发送到一些JavaScript代码。我怎么会得到时间呢? 例如,以HH / MM / SS格式。 问题答案: let unix_timestamp = 1549312452 有关Date对象的更多信息,请参考MDN或ECMAScript5规范。

  • 我试图找出如何在Kotlin中将转换为,这在Java中非常简单,但我在Kotlin中找不到任何等效的。 例如:历元时间戳(1970-01-01以来的秒数)== 在Kotlin中是否有解决方案,或者我是否必须在Kotln中使用Java语法?请给我一个简单的例子来说明如何解决这个问题。提前谢谢。 这个链接不是我问题的答案