Joda DateTime toDate返回的日期与创建的DateTime不同

时间:2019-05-17 06:16:44

标签: java datetime timezone jodatime

您好,我注意到使用“区域”创建的Joda DateTime正在根据“当前系统日期”返回到“日期”。我期望toDate根据创建的DateTime返回。根据Joda API,它说 toDate应该返回以此日期时间初始化的日期。我在Maven中使用Joda 2.9.4。来自古鲁斯的任何想法都在

public class TestJodaError {

public static void main(String[] args) {
    DateTime ldt = new DateTime();
    System.out.println("Local dt: " + ldt + " toDate: " + ldt.toDate());

    String tzId = "Asia/Singapore";
    ZoneId zoneId = ZoneId.of(tzId);
    ZonedDateTime zdt = ZonedDateTime.now(zoneId);

    DateTimeZone dtZone = DateTimeZone.forID(zdt.getZone().getId());
    DateTime rdt = new DateTime(dtZone);
    System.out.println("Remote dt: " + rdt + " toDate: " + rdt.toDate());
}}

结果是

Local dt: 2019-05-17T11:33:30.333+05:30 toDate: Fri May 17 11:33:30 IST 2019
Remot dt: 2019-05-17T14:03:30.738+08:00 toDate: Fri May 17 11:33:30 IST 2019

预期结果

Remot dt: 2019-05-17T14:03:30.738+08:00 toDate: Fri May 17 14:03:30 SGT 2019

2 个答案:

答案 0 :(得分:3)

正如安迪所说,日期将没有任何特定的时区信息。如果您想在没有Joda时间的情况下使用并且想利用Java 8,请在下面的代码段中提供。

LocalDateTime ldt = LocalDateTime.of(2019, Month.MAY, 17, 11, 30);
ZonedDateTime klDateTime = ldt.atZone(ZoneId.of("Asia/Kolkata"));
DateTimeFormatter indianFormat = DateTimeFormatter.ofPattern("dd MMM yyyy");

String output = klDateTime.format(indianFormat);

答案 1 :(得分:2)

打印java.util.Date将始终使用JVM的默认时区,因为Date实际上并不包含任何时区信息。

这样,如果rdt.toDate()也以IST打印,则打印ldt.toDate()的结果将以IST打印。