繁体   English   中英

我的乔达时区消息

[英]my joda time zone messup

伙计们

我在使用joda时间api的新手。 所以这是我的问题。 Ive应用服务器部署在西部地区的某个地方,日期固定为特定时间,UTC 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

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

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

如果你想看到的日期在给定的时区,然后打印DateTime实例本身(其中包含一个时刻时区),而不是将其转化为一个日期(它失去时区信息),或使用SimpleDateFormat与配置您想要将java.util.Date显示为所需时区java.util.Date的字符串的时区。

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。

有关更多示例,请检查此链接

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

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

希望这个对您有用。 如果您可以进一步优化此代码,那就太好了。 干杯!

暂无
暂无

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

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