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

时间:2015-09-18 17:52:59

标签: java datetime jodatime utc

大家早上好。

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

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

我的测试>

    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

如何执行此转换为小时:分钟:UTC这个旧版JODA的第二个?

我研究了很多,看到一些人这样说会是一个好习惯吗?

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"不幸的是#34;。

我在一家公司工作,这个公司有很长的过程来改变项目中的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));

    }
}

My Out Put:in in 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

1 个答案:

答案 0 :(得分:5)

正确的方法是使用toDate()

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

关于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 UTC
In Brazil:          2015-09-19 07:45:00.000 BRT
In the Netherlands: 2015-09-19 12:45:00.000 CEST

您可以看到我们打印同一日期 - 并且根据格式的时区显示不同。

从Joda TimeStamp正确转换为java.util.Date

同样的逻辑对于Joda的DateTime对象也是如此,但它更复杂,因为它还包括一个时区,尽管它不用于所有操作。在内部,它也代表了与UTC的偏移。

当您使用其toDate()方法时,它依赖于UTC的内部偏移量,因此它会根据{{1}为您提供正确的Date对象合同。

让我们通过将我们在上述程序中获取日期的方式替换为:

java.util.Date

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

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

所以你看,如果Joda DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC); Date javaDate = jodaDateTime.toDate(); 被正确设置,那么使用DateTime可以得到正确的toDate对象。

显示使用Date错误

现在,如果我们使用您的第一种方法,您认为正确的方法(仅存在于Joda 2.0及更高版本中),我们会得到什么?

我们将代码更改为:

toLocalDateTime()

Joda DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC); Date javaDate = jodaDateTime.toLocalDateTime().toDate(); 与之前相同,我们只添加了仅存在于Joda 2中的DateTime

假设系统上的默认时区是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

这显然不是正确的日期! toLocalDateTime()部分将您当地的时间偏移量加到日期,以便制作一个" local"日期。只要你保持在Joda时间结构中,这是好的,但是会违反toLocalDateTime()的合同,因为它设置了与UTC不正确的偏移量。

结论

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

最后一条建议:如果您想在公司开始升级过程,请不要为Joda时间而烦恼。请他们开始将系统升级到Java 8,这是目前Oracle维护的唯一Java版本。 Java 8包含一个正确的日期/时间库,Joda的创建者建议切换到使用它。