我的joda时区杂乱

时间:2015-02-06 08:58:41

标签: java jodatime

人。

即时新手使用joda time api。所以这是我的问题。 Ive应用服务器部署在西部地区的某个地方,日期固定在特定时间,即2015年2月6日星期五08:50:54。

但是,我尝试使用joda时区将时区更改为我的国家/地区。它没有成功。我的想法已经用完了。下面是我的代码:

java.util.Date dateIn = new java.util.Date(); 
            DateTime dateTimeUtc = new DateTime( dateIn, DateTimeZone.UTC );
            System.out.println("date time utc : " + dateTimeUtc);


            DateTimeZone timeZoneLos_Angeles = DateTimeZone.forID( "America/Los_Angeles" ); // Adjust time zone to United States.
            DateTime dateTimeLos_Angeles = dateTimeUtc.withZone( timeZoneLos_Angeles );
            System.out.println("los angeles date time : " + dateTimeLos_Angeles.toDate());

            DateTimeZone timeZoneMalaysia = DateTimeZone.forID( "Asia/Singapore" );
            DateTime dateTimeKL = dateTimeLos_Angeles.withZone( timeZoneMalaysia );
            System.out.println("KL date time : " + dateTimeKL.toDate());

            java.util.Date newDate = dateTimeKL.toDate();

            System.out.println("after convert to j.u.Date : " + newDate);

输出:

date time utc : 2015-02-06T08:58:29.127Z
los angeles date time : Fri Feb 06 16:58:29 SGT 2015
KL date time : Fri Feb 06 16:58:29 SGT 2015
after convert to j.u.Date : Fri Feb 06 16:58:29 SGT 2015

我不知道现在发生了什么。 joda时间正在使用我当地的机器时间。 你能解释一下这里发生了什么吗?我是以错误的方式访问joda时间。还是我的错?

3 个答案:

答案 0 :(得分:3)

java.util.Date与joda-time Instant基本相同:是世界时间尺度的瞬间。它没有任何时区。它只是包含在一个对象中的毫秒数。因此,当您在toString()实例上调用java.util.Date时,此对象会尝试使这个毫秒数可读,并使用 JVM的默认时区将其转换为可读日期:在这种情况下的SGT。

如果要查看给定时区中的日期,请打印DateTime实例本身(其中包含即时时区),而不是将其转换为日期(丢失时区信息),或者使用配置了时区的SimpleDateFormat,将java.util.Date显示为所需时区的字符串。

答案 1 :(得分:0)

Joda Time为Java日期和时间类提供了高质量的替代品。该设计允许多个日历系统,同时仍提供简单的API。将Joda DateTime对象从一个时区转换为另一个时区非常简单,并为您节省了大量代码。见下面的方法。

public static Date convertJodaTimezone(LocalDateTime date, String srcTz, String destTz) {
    DateTime srcDateTime = date.toDateTime(DateTimeZone.forID(srcTz));
    DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID(destTz));
    return dstDateTime.toLocalDateTime().toDateTime().toDate();
}

由于Joda Time有自己的类来存储Date和Calendar对象,因此DateTime类有自己的toDate()方法,用于将其转换为java.util.Date。

有关更多示例,请查看此link

答案 2 :(得分:0)

我重复使用了您的代码并进行了一些更改。注释行是先前的实现,以便您可以将差异与新实现进行比较。

    Date dateIn = new Date(); 
    DateTime dateTimeUtc = new DateTime( dateIn, DateTimeZone.UTC );
    System.out.println("date time utc : " + dateTimeUtc);

    DateTimeZone timeZoneLos_Angeles = DateTimeZone.forID( "America/Los_Angeles" ); // Adjust time zone to United States.
    //DateTime dateTimeLos_Angeles = dateTimeUtc.withZone( timeZoneLos_Angeles );
    DateTime dateTimeLos_Angeles = dateTimeUtc.withZone(timeZoneLos_Angeles);
    //System.out.println("los angeles date time : " + dateTimeLos_Angeles.toDate());
    System.out.println("los angeles date time : " + dateTimeLos_Angeles.toLocalDateTime().toDate());

    DateTimeZone timeZoneMalaysia = DateTimeZone.forID( "Asia/Singapore" );
    DateTime dateTimeKL = dateTimeUtc.withZone(timeZoneMalaysia);
    //System.out.println("KL date time : " + dateTimeKL.toDate());
    System.out.println("KL date time : " + dateTimeKL.toLocalDateTime().toDate());

    //Date newDate = dateTimeKL.toDate();
    Date newDate = dateTimeKL.toLocalDateTime().toDate();

    System.out.println("after convert to j.u.Date : " + newDate);

我希望这个适合你。如果你可以进一步优化这个代码那么好。干杯!