人。
即时新手使用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时间。还是我的错?
答案 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);
我希望这个适合你。如果你可以进一步优化这个代码那么好。干杯!