joda API 和 UTC 时区的分钟/小时时差错误

Posted

技术标签:

【中文标题】joda API 和 UTC 时区的分钟/小时时差错误【英文标题】:Wrong time difference in minute/hour with joda API and UTC timezone 【发布时间】:2014-07-10 05:43:44 【问题描述】:
Date date = //getting Date object of (record inserted datetime) using Hibernate query . 
DateTime currentDateTime = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
System.out.println("Current Date Time " + currentDateTime);
DateTime utcDateTime = new DateTime(date, DateTimeZone.UTC);
System.out.println("UTC Date Time :: " + utcDateTime);
Period per = new Period(currentDateTime.toLocalDateTime(), utcDateTime.toLocalDateTime());
System.out.println("Period time in sec ::" + (float) per.toStandardSeconds().getSeconds());
System.out.println("Period time in minutes::" + (float) per.toStandardSeconds().getSeconds() / 60);
System.out.println("Period time in hours::" + (float) per.toStandardSeconds().getSeconds() / (60 * 60));

我在从 mysql DB 获取数据时使用 joda API 和 Hibernate。我将所有具有 UTC 时区的数据存储在 MySQL 数据库中。现在我想获取当前时间和插入记录之间的时差。我的本地时区是 GMT+5:30。我在时差上弄错了时间(+5:30 小时有实际差异)。不知道我在哪里做错了?编辑: 我正在使用此代码将日期存储在数据库中。

DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format);
DateTime dateTime = new DateTime(DateTimeZone.UTC);
return dateTime.toString(dateTimeFormatter);

【问题讨论】:

它是 java.util.Date。查看更新的问题。 我不知道你是怎么从上面的评论到你的编辑的...... 我在那边提到我正在从 DB 获取 Date 对象。 您的问题仍然没有在任何地方显示 java.util.Date,为什么您使用 string 表示来存储您的日期?为什么您仍然没有提供任何值?基本上这里有很多未知的东西,我们帮不了你...... @VishalZanzrukia:“日期对象”仍然可以是 java.util.Date 或 java.sql.Date。鉴于您是从 数据库 获取的,java.sql.Date 实际上会更常见。 【参考方案1】:

您的问题令人困惑,应该重写。

无需调用 currentTimeMillis,因为 DateTime 默认会这样做。

无需调用 toLocalDateTime。当您想丢失时区但您已经在 UTC 中,因此没有适用时区,因此无需删除时区时,将使用该选项。

您在计算秒、分钟、小时的 println 行上工作得太辛苦了。 PeriodFormatterBuilder 类执行此类工作。

你需要清楚java.util.Date和java.sql.Date。后者将时间部分设置为零。两者都没有时区。请注意与 Java 捆绑在一起的第三种类型,java.sql.Timestamp。

在调试和发布此类问题时,获取支持 Date 和 DateTime 对象的毫秒数,以便我们获得准确的数据。在我通常的工作中,我避免使用或思考毫秒,但对于调试它可能很有用。

正如 Jon Skeet 所说,您应该将日期时间值作为日期时间类型存储在数据库中,而不是字符串。

我建议你在 *** 上搜索许多提供示例代码的类似问题。

【讨论】:

嗨@Basil,非常感谢您的回答和如此好的建议。但我真的不明白它是如何令人困惑的。我没有在我的数据库中使用VARCHAR datetype,我使用的是DATETIME。我只是使用String 来存储它。这会有什么问题吗?除了我只是从数据库中存储和检索日期之外。它给了我错误的数据。如何?那是问题。如果可能,请帮助我 看看我的新问题,你可能会更清楚:***.com/questions/23823671/…

以上是关于joda API 和 UTC 时区的分钟/小时时差错误的主要内容,如果未能解决你的问题,请参考以下文章

美东时间和美西时间分别与北京时间相差多少?

时区之间的时差为 1 小时 6 秒

使用 Joda-Time 获取给定日期和时区的 UTC 偏移量

解决 linux和widows双系统时差8个小时问题

utc时间21是北京时间多少

GMT时间跟中国时间相差多少