我需要将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));
让我知道它是否有效。