使用Joda时间的Java UTC区域中的日期



我需要将Joda时间日期/时间转换为java.util.Date。我正在做以下事情。

DateTimeFormatter dateTimeFormatter=DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa");
DateTime dateTime = dateTimeFormatter.parseDateTime("2-Oct-2013 11:34:26 AM").withZone(DateTimeZone.UTC);
System.out.println(dateTime);

这将按预期显示由UTC区域表示的日期/时间。在这种情况下,它是2013-10-02T06:04:26.000Z

当该dateTime被如下转换为java.util.Date时,

System.out.println(dateTime.toDate());

显示为CCD_。它应该是UTC格式。

有没有一种方法可以将Date从Joda Time转换为UTC

我希望将日期存储到数据库中,如UTC区域所示。在将org.joda.time.DateTime插入数据库之前,需要将其转换为java.util.Date(或java.sql.Timestamp(。如何克服这种情况

每个定义的java.util.Date对象始终使用UTC
(时间戳是自1970年1月1日UTC以来的毫秒数(

但在时间格式化之前,您必须将时区设置为utc:

TimeZone utc = TimeZone.getTimeZone("UTC")
SimpleDateFormatter df = new SimpleDateFormatter (PATTERN);
df.setTimeZone(utc);
System.out.println(df.format(date));

在代码中,您使用了java.util.Date.toString()方法,该方法使用系统默认时区。

java.util.Date字符串输出不是UTC

来自您的问题:

它显示,10月2日星期三11:34:26 IST 2013。它应该是UTC格式。

不应该是而不是的UTC格式。这可能是您想要的,但这不是记录类行为的方式。

您的代码:

System.out.println(dateTime.toDate());

…首先将Joda Time DateTime转换为java.util.Date对象,然后在该j.Date对象上隐式调用toString方法。j.u.Date的toString方法的记录行为是将JVM当前默认时区应用于生成的字符串。在内部,j.u.Date确实是UTC,但它生成的字符串不是。toString的这种行为是Java团队的一个善意但最终非常糟糕的设计决定,给无数程序员带来了无尽的困惑。但这是有案可查的行为。您应该始终仔细阅读库的文档,而不是假设库的行为与您想象的一样。

显示Joda时间DateTime(UTC(

来自您的问题:

有没有一种方法可以在从Joda时间转换后用UTC表示日期?

是的,与处理java.util.Date/.Calendar/SimpleDateFormat不同,在UTC中生成Joda Time DateTime的字符串表示形式既简单又清晰。只需调用withZone即可根据原始时区实例化一个新的DateTime,但要调整到另一个时区。

Joda Time 2.5中的一个小示例源代码应该会让它变得显而易见。还可以使用Joda Time在StackOverflow中搜索数百个其他示例。

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime nowInMontréal = DateTime.now( zoneMontréal );
DateTimeZone zoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTime nowInKolkata = nowInMontréal.withZone( zoneKolkata ); // Instantiating a new date-time object based on the original but adjusted for another time zone.
DateTime nowInUtc = nowInMontréal.withZone( DateTimeZone.UTC ); // Ditto, new object, adjusted time zone.

当通过在每个DateTime:上调用toString转储到控制台时

nowInMontréal: 2014-11-14T02:03:19.932-05:00
nowInKolkata: 2014-11-14T12:33:19.932+05:30
nowInUtc: 2014-11-14T07:03:19.932Z

这三者都代表着宇宙时间线上同时发生的同一时刻。蒙特利尔时间比UTC晚五个小时,印度时间比UTC早五个半小时。相同的时刻,但不同的挂钟时间。

将Joda时间DateTime放入数据库

来自您的问题:

我希望将日期存储到数据库中,以UTC区域表示。在将org.joda.time.DateTime插入数据库之前,需要将其转换为java.util.Date(或java.sql.Timestamp(。如何克服这种情况?

简单。通过传递自Unix epoch以来的毫秒数来构造java.sql.Timestamp对象。请注意,计数必须是long,而不是int

java.sql.Timestamp ts = new java.sql.Timestamp( dateTime.getMillis() );

提示:要注意数据库日期时间数据类型的性质。例如,Postgres对这类类型(包括SQL规范定义的类型(有很好的支持。许多数据库没有,只支持旧的遗留类型或少数弱类型。阅读文档并进行实验,以确保您理解行为。

publicDatetoDate(时区时区(

使用指定的时区以java.util.date的形式获取日期-时间。

创建的Date对象与此日期时间具有完全相同的字段,但由于夏令时间隔而导致时间无效的情况除外。在这种情况下,时间将设置为间隔之后的最早有效时间。

在夏令时重叠的情况下,会选择较早的时刻。

转换为JDK Date充满了复杂性,因为JDK Date构造函数在DST转换时的行为并不像您所期望的那样。这种方法首先进行猜测,然后进行调整。这也处理JDK时区数据与Joda时区数据不同的情况。

与toDate((不同,此实现不依赖于Java的同步时区初始化逻辑,并且应该展示更好的并发性能特性。

所以这看起来像:

Timezone utc = Timezone.getTimezone("UTC")
System.out.println(dateTime.toDate(utc));

让我知道它是否有效。

相关内容

  • 没有找到相关文章

最新更新