gpt4 book ai didi

java - Joda Time - 将 UTC 日期时间转换为日期 - 使用 Joda 版本 1.2.1.1

转载 作者:行者123 更新时间:2023-12-01 16:56:07 31 4
gpt4 key购买 nike

大家早上好。

我想帮助您了解如何使用 1.2.1.1 版本的 Joda Time 完成 org.joda.time.DateTime 到 java.util.Date 的转换。

为什么选择 Joda 1.2.1.1?因为“不幸的是”目前我只能使用这个版本的 Joda。

我的测试>

    System.out.println("JODA Version : 2.8.2 - UTC TIME to Date " + new DateTime().withZone(DateTimeZone.UTC).toLocalDateTime().toDate());;
System.out.println("JODA Version : 1.2.1.1 - UTC TIME to Date " + new DateTime().withZone(DateTimeZone.UTC).toDate());;


JODA Version : 2.8.2 - UTC TIME to Date Fri Sep 18 17:34:36 BRT 2015
JODA Version : 1.2.1.1 - UTC TIME to Date Fri Sep 18 14:34:36 BRT 2015

我的问题是,在版本 1.2.1.1 中,日期位于我的本地设置中,而在此版本中没有 toLocalDateTime() 方法。

我会请求您的帮助和经验来发现最佳实践,以便在 JODA 版本:1.2.1.1 中执行此转换

在旧版本的 JODA 中,如何将 UTC 时间转换为时:分:秒?

我做了很多研究,发现有些人说这样做是一个很好的做法?

public  static Date converterDateTimeToUTCDate(final DateTime dateTime) throws ParseException {
DateTime dat = dateTime.withZone(DateTimeZone.UTC);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").parse(dat.toString("yyyy-MM-dd HH:mm:ss:SSS"));
}

public static void main(String[] args) throws ParseException {
System.out.println("TODO DATE UTC TIME : " + new DateTime().withZone(DateTimeZone.UTC));
System.out.println("TODO DATE Convertion Direct Date: " + new DateTime().withZone(DateTimeZone.UTC).toDate());

Date converterUTCDateTimeToDate = converterDateTimeToUTCDate(new DateTime());

System.out.println("TODO DATE UTC with Parse : " + converterUTCDateTimeToDate);

}

结果:

TODO DATE UTC TIME : 2015-09-18T22:33:57.353Z
TODO DATE Convertion Direct Date: Fri Sep 18 19:33:57 BRT 2015
TODO DATE UTC with Parse : Fri Sep 18 22:33:57 BRT 2015

编辑为什么选择 Joda 1.2.1.1?因为“不幸的是”目前我只能使用这个版本的 Joda。

我在一家公司工作,在项目中更改 API 版本需要很长的过程,而我的项目没有这个等待时间来使用新版本

更新:

我看了一下,java Date没有TimeZone,这个BRT是在类的toString()方法中从我的本地机器捕获的,我可以认为转换是正确的吗?

更新2

我编辑了我的答案示例:

参见:

package joda;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class ConverterDateTimeToDate {
public static final String BASE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS z";

public static void main(String[] args) {

// Different display time zones

SimpleDateFormat formatUTC = new SimpleDateFormat( BASE_FORMAT );
formatUTC.setTimeZone(TimeZone.getTimeZone("UTC"));

SimpleDateFormat formatBrazil = new SimpleDateFormat( BASE_FORMAT );
formatBrazil.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));

SimpleDateFormat formatCentralEurope = new SimpleDateFormat( BASE_FORMAT );
formatCentralEurope.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));

// Get a date in UTC

String dateString = "2015-09-19 10:45:00.000 UTC";
Date javaDate = null;
try {
DateTime dateTime = new DateTime().withZone(DateTimeZone.forID("America/Mexico_City"));
System.out.println("MEX TIME IN JODA : " + dateTime); //new Test
System.out.println("MEX TIME IN JODA CONVERTER : " + dateTime.toDate()); // new Test
System.out.println("Now in MEX Time Zone DateTime : " + dateTime);

javaDate = formatUTC.parse(dateTime.toString(BASE_FORMAT));
} catch (ParseException e) {
e.printStackTrace(); // Shouldn't happen.
}

// Now let's print it in various time zones. It's the same date - 10:45 in UTC!

System.out.println("In UTC: " + formatUTC.format(javaDate));
System.out.println("In Brazil: " + formatBrazil.format(javaDate));
System.out.println("In the Netherlands: " + formatCentralEurope.format(javaDate));

}
}

我的输出:在UTC:2015-09-19 12:10:56.731 CDT,我的转换有问题吗?因为我的系统中的日期时间已经消失了

我的输出:

MEX TIME IN JODA : 2015-09-21T21:17:46.781-05:00
MEX TIME IN JODA CONVERTER : Mon Sep 21 23:17:46 BRT 2015
Now in MEX Time Zone DateTime : 2015-09-21T21:17:46.781-05:00
In UTC: 1732-01-11 02:17:46.781 UTC
In Brazil: 1732-01-10 23:17:46.781 BRT
In the Netherlands: 1732-01-11 03:17:46.781 CET

最佳答案

正确的方法是使用toDate()

DateTime 类中的方法,即使在旧的 JodaTime 中,也是正确的。这里有一个解释:

<小时/>

有关 java.util.Date 工作原理的说明

您似乎对java.util.Date有误解。它不包含时区。它表示自 1970 年 1 月 00:00 UTC 以来的时间偏移。

当您打印 Date 对象时,您的 JVM 会采用您的默认时区并显示该时区的Date。因此,当您打印日期时,如果您想在不同的时区查看日期,则应始终使用 DateFormat 对象。例如,如果您想查看 UTC 格式的日期,则必须使用时区设置为 UTC 的日期格式。这是一个例子:

public static final String BASE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS z";

public static void main(String[] args) {

// Different display time zones

SimpleDateFormat formatUTC = new SimpleDateFormat( BASE_FORMAT );
formatUTC.setTimeZone(TimeZone.getTimeZone("UTC"));

SimpleDateFormat formatBrazil = new SimpleDateFormat( BASE_FORMAT );
formatBrazil.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));

SimpleDateFormat formatCentralEurope = new SimpleDateFormat( BASE_FORMAT );
formatCentralEurope.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));

// Get a date in UTC

String dateString = "2015-09-19 10:45:00.000 UTC";
Date javaDate = null;
try {
javaDate = formatUTC.parse(dateString);
} catch (ParseException e) {
e.printStackTrace(); // Shouldn't happen.
}

// Now let's print it in various time zones. It's the same date - 10:45 in UTC!

System.out.println("In UTC: " + formatUTC.format(javaDate));
System.out.println("In Brazil: " + formatBrazil.format(javaDate));
System.out.println("In the Netherlands: " + formatCentralEurope.format(javaDate));

}

该程序的输出是:

In UTC:             2015-09-19 10:45:00.000 UTCIn Brazil:          2015-09-19 07:45:00.000 BRTIn the Netherlands: 2015-09-19 12:45:00.000 CEST

You can see we printed the same date - and it shows up differently based on the time zone of the format.


Converting properly from Joda TimeStamp to java.util.Date

The same logic is true for Joda's DateTime object, but it's more complex, because it also includes a time zone, though it is not used for all operations. Internally, it also represents an offset from UTC.

When you use its toDate() method, it relies on that internal offset from UTC, thus it is giving you the correct Date object according to the java.util.Date contract.

Let's demonstrate that by replacing the way we get the date in the above program to:

DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC);

Date javaDate = jodaDateTime.toDate();

现在,运行与之前相同的打印,我们再次得到:

In UTC:             2015-09-19 10:45:00.000 UTCIn Brazil:          2015-09-19 07:45:00.000 BRTIn the Netherlands: 2015-09-19 12:45:00.000 CEST

So you see, if the Joda DateTime was appropriately set, then using its toDate gives you the correct Date object.


Showing that using toLocalDateTime() is wrong

Now, if we use your first method, the one you thought was correct, which only exists in Joda 2.0 and above, what will we get?

We change the code to:

DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC);
Date javaDate = jodaDateTime.toLocalDateTime().toDate();

Joda DateTime 与之前相同,我们只是添加了仅在 Joda 2 中存在的 toLocalDateTime()

假设您系统上的默认时区是 BRT,您将得到结果:

In UTC:             2015-09-19 13:45:00.000 UTCIn Brazil:          2015-09-19 10:45:00.000 BRTIn the Netherlands: 2015-09-19 15:45:00.000 CEST

这显然不是正确的日期! toLocalDateTime() 部分获取您的本地时间偏移量并将其添加到日期中以形成“本地”日期。只要您保持在 Joda 时间构造中,这就很好,但是违反了 java.util.Date 的约定,因为它设置了与 UTC 的不正确偏移。

<小时/>

结论

旧 Joda 中的旧方法是从 org.joda.time.DateTime 获取适当的 java.util.Date 的最佳方法。但您必须非常小心如何打印 java.util.Date,因为默认情况下它将在您的默认时区中打印。

最后一个建议:如果您想在公司中开始升级过程,请不要浪费 Joda 时间。要求他们开始将系统升级到 Java 8,这是目前 Oracle 维护的唯一 Java 版本。 Java 8 包含一个适当的日期/时间库,Joda 的创建者建议改用它。

关于java - Joda Time - 将 UTC 日期时间转换为日期 - 使用 Joda 版本 1.2.1.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658205/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com