【问题标题】:Wrong time difference in minute/hour with joda API and UTC timezonejoda API 和 UTC 时区的分钟/小时时差错误
【发布时间】: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 实际上会更常见。

标签: java mysql hibernate jodatime intervals


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

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