【问题标题】:Java.util.Date not converting properly to Java.time.LocalDateJava.util.Date 未正确转换为 Java.time.LocalDate
【发布时间】:2018-10-31 00:01:58
【问题描述】:

我正在尝试将 java Date 转换为 java LocalTime,我的代码看起来像这样

Date memberBirthdayDate = club.getMembers().get(i).getDob();
        System.out.println(memberBirthdayDate);
        LocalDate memberBirthday = memberBirthdayDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

当我打印出转换前后的日期时,它看起来像这样:

Before: Wed May 21 00:00:00 GMT 94
After: 0094-05-18

看起来它正在向后转换,但我不知道该怎么做!

【问题讨论】:

  • 这是一个公历/儒略的差异。如果您不知道,请查看它。 LocalDate 使用预测的公历。我不确定Date 使用什么。对于公元 94 年(1900 多年前)的日期,你不应该对 5 月 21 日和 5 月 18 日一样感到惊讶。
  • 你要么有一些非常老的俱乐部成员 (Emperor An of Han?) 要么在你的岁月中有一个错误。也许您打算改为 1994 年?
  • @OleV.V.而已!我通过 Excel 从 csv 导入,它已自动格式化日期以删除“19”......非常感谢!

标签: java date time localdate


【解决方案1】:

你可以这样做

 LocalDateTime memberBirthday = LocalDateTime.ofInstant(memberBirthdayDate.toInstant(), 
ZoneId.systemDefault());
Date out = Date.from(memberBirthday.atZone(ZoneId.systemDefault()).toInstant()); System.out.println(out);

【讨论】:

  • 这似乎没有产生所要求的LocalDate?而且似乎也没有解决 5 月 21 日变成 5 月 18 日的问题,也没有解决 1994 年变成 94 的问题?
【解决方案2】:

您的岁月中似乎有一个错误。您在评论中自己给出了答案:

我通过 Excel 从 csv 导入,它自动 格式化日期以删除“19”

您所做的转换非常适合 1994 年的日期:

    System.out.println("Before: " + memberBirthdayDate);
    LocalDate memberBirthday = memberBirthdayDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    System.out.println("After: " + memberBirthday);

输出:

Before: Sat May 21 00:00:00 IST 1994
After: 1994-05-21

我使用欧洲/都柏林时间来重现您的确切结果,因此 IST 代表爱尔兰夏令时间。您的 Date 似乎表示某个 GMT 偏移量的开始时间,因此您需要使用与该偏移量一致的时区。我希望转换至少在 1900 年后的所有日期都能按预期进行,而且可能更早。

但是,当年份从 1994 年缩短到 94 年时,有趣的事情开始发生。很久以前的日期没有那么明确。 LocalDate 使用的是公历,实用且定义明确,但与从 1582 年及以后引入公历之前的现实生活中使用的日期不一致。我不确定Date 使用什么。追溯到公元 94 年,我们不应该对 5 月 21 日和 5 月 18 日一样感到惊讶。

Before: Wed May 21 00:00:00 GMT 94
After: 0094-05-18

链接: Wikipedia article Gregorian calendar

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2015-04-28
    • 2021-12-22
    相关资源
    最近更新 更多