简体   繁体   English

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

[英]Joda Time - Convert UTC DateTime to Date - Using a Version 1.2.1.1 of Joda

Good morning everyone. 大家,早安。

I'd like to help you to see how I can accomplish the conversion of a org.joda.time.DateTime to java.util.Date using the 1.2.1.1 version of Joda Time. 我想帮助您了解如何使用1.2.1.1版本的Joda Time将org.joda.time.DateTime转换为java.util.Date。

Why Joda 1.2.1.1 ? 为什么选择乔达1.2.1.1? Because currently I can only work with this version of Joda "unfortunately". 因为当前我只能“不幸地”使用此版本的Joda。

My Test> 我的测试>

    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

My problem being that in version 1.2.1.1 the Date is on my local settings and in this version there is no toLocalDateTime() method. 我的问题是,在1.2.1.1版中,日期位于我的本地设置上,而在此版本中,没有toLocalDateTime()方法。

I would ask the help and experience of you to discover the best practices in order to perform this conversion in JODA Version: 1.2.1.1 我想请您的帮助和经验来发现最佳实践,以便在JODA版本:1.2.1.1中执行此转换。

How can I perform this conversion to the hour: minute: second in UTC this older version of JODA? 在旧版本的JODA中,如何在UTC中将时间转换为小时:分钟:秒?

I researched a lot and saw some people talking to do so would be a good practice? 我做了很多研究,发现有人说这样做会是一个好习惯吗?

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);

}

Result: 结果:

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

EDIT Why Joda 1.2.1.1 ? 编辑为什么选择乔达1.2.1.1? Because currently I can only work with this version of Joda "unfortunately". 因为当前我只能“不幸地”使用此版本的Joda。

I work in a company where there is a very long process to change the version of an API within the project and my project does not have this waiting time, to use a new version 我在一家公司中工作,该公司需要很长时间才能在项目中更改API版本,而我的项目没有此等待时间,因此无法使用新版本

UPDATE: 更新:

I looked and java Date has no TimeZone, this BRT is caught from my local machine in the toString () method of the class, I can consider that it is right to convert then? 我看了一下,java Date没有TimeZone,这个BRT是在类的toString()方法中从本地计算机捕获的,我可以认为转换是正确的吗?

UPDATE 2 更新2

I edited the example of my answer for an example: 我为示例编辑了答案示例:

See: 看到:

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));

    }
}

My Out Put : in In UTC: 2015-09-19 12:10:56.731 CDT , Was the problem with my convertion ? 我的输出结果:在UTC中输入:2015-09-19 12:10:56.731 CDT ,我的转换问题吗? Because my DateTime in System it's come this aways 因为我在系统中的DateTime来了

My Output: 我的输出:

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

The correct way is to use toDate() 正确的方法是使用toDate()

The method in the DateTime class, even in old JodaTime, is the correct one. 即使在较旧的JodaTime中, DateTime类中的方法也是正确的。 Here is an explanation: 这里是一个解释:


Explanation about how java.util.Date works 有关java.util.Date如何工作的说明

You seem to have a misconception about java.util.Date . 您似乎对java.util.Date有误解。 It does not contain a time zone. 它不包含时区。 It is a representation of a time offset since January 1970, 00:00 UTC . 它表示自1970年1月以来的时间偏移量, UTC时间00:00。

When you print a Date object, your JVM takes your default time zone and shows you the Date at that time zone. 当您打印Date对象时,您的JVM将使用您的默认时区并向您显示该时区的Date So when you print dates, you should always use a DateFormat object if you want to look at them in a different time zone. 因此,在打印日期时,如果要在其他时区查看日期,则应始终使用DateFormat对象。 For example, if you want to see what the date is in UTC, you have to use a date format with its time zone set to UTC. 例如,如果要查看UTC日期,则必须使用其时区设置为UTC的日期格式。 Here is an example: 这是一个例子:

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));

}

The output from this program is: 该程序的输出为:

In UTC:             2015-09-19 10:45:00.000 UTC
In Brazil:          2015-09-19 07:45:00.000 BRT
In 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 从Joda TimeStamp正确转换为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. 对于Joda的DateTime对象,逻辑相同,但更复杂,因为它还包括时区,尽管并非用于所有操作。 Internally, it also represents an offset from UTC. 在内部,它也表示与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. 当使用其toDate()方法时,它依赖于UTC的内部偏移量,因此,它根据java.util.Date协定为您提供了正确的Date对象

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();

Now, running the same prints as before, again we get: 现在,运行与以前相同的打印,我们再次得到:

In UTC:             2015-09-19 10:45:00.000 UTC
In Brazil:          2015-09-19 07:45:00.000 BRT
In 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. 因此,您可以看到,如果正确设置了Joda DateTime ,则使用其toDate将为您提供正确的Date对象。


Showing that using toLocalDateTime() is wrong 显示使用toLocalDateTime()是错误的

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? 现在,如果我们使用第一种方法,那么您认为正确的方法(仅在Joda 2.0及更高版本中存在),我们将得到什么?

We change the code to: 我们将代码更改为:

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

The Joda DateTime is the same as before, we just added the toLocalDateTime() that exists only in Joda 2. Joda DateTime与以前相同,我们只是添加了仅在Joda 2中存在的toLocalDateTime()

Assuming the default time zone on your system is BRT, you get the result: 假设系统上的默认时区是BRT,您将得到以下结果:

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

This is clearly not the correct date! 这显然不是正确的日期! The toLocalDateTime() part took your local time offset and added it to the date to make a "local" date. toLocalDateTime()部分获取了您的本地时间偏移,并将其添加到日期中以形成“本地”日期。 Which is good as long as you stay within Joda time constructs, but breaks the contract for java.util.Date because it sets the incorrect offset from UTC. 只要您停留在Joda时间构造内,这就很好,但是因为它设置了与UTC不正确的偏移量,所以违反了java.util.Date的约定。


Conclusion 结论

The old method you had in the old Joda is the best one to get an appropriate java.util.Date from an org.joda.time.DateTime . 在旧的Joda中使用的旧方法是从org.joda.time.DateTime获取适当的java.util.Dateorg.joda.time.DateTime But you have to be very careful at how you print the java.util.Date because it will be printed by default in your default time zone. 但是您在打印java.util.Date必须非常小心,因为默认情况下它将在您的默认时区打印。

One last advice: if you want to start the upgrade process in your company, don't bother with Joda time. 最后一个建议:如果您想在公司中开始升级过程,请不要担心Joda的时间。 Ask them to start upgrading the system to Java 8, which is currently the only Java version maintained by Oracle. 请他们开始将系统升级到Java 8,这是Oracle唯一维护的Java版本。 Java 8 includes a proper Date/Time library and the creators of Joda recommend switching to using that. Java 8包括适当的日期/时间库,Joda的创建者建议改用该库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM