繁体   English   中英

将 java.util.Date 转换为 datastax 的 LocalDate

[英]convert java.util.Date to datastax's LocalDate

我正在尝试将yyyy-MM-dd字符串格式的日期转换为 datastax 的 LocalDate。 我正在使用以下代码来做到这一点。

private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

public static LocalDate getDate(String date) throws ParseException {
    Date d = DATE_FORMAT.parse(date);
    return LocalDate.fromMillisSinceEpoch(d.getTime());
}

当我测试这种方法时,我没有得到预期的结果。

public static void main(String[] args) throws ParseException {
    System.out.println(getDate("2017-11-22"));
}
// Actual Output:
2017-11-21
// Excpected Output:
2017-11-22

有什么我在这里想念的吗?

TL; 博士

public static LocalDate getDate(String date) {
    java.time.LocalDate jtld = java.time.LocalDate.parse(date);
    return LocalDate.fromYearMonthDay(jtld.getYear(), jtld.getMonthValue(), jtld.getDayOfMonth());
}

时间

您正在使用的 Java 日期和时间类DateSimpleDateFormat早已过时且设计不佳,尤其是后者已被证明很麻烦。 此外,现代 Java 日期和时间 API java.time提供了一个也称为LocalDate的类,它比过时的Date类更符合您的需求。 java.time.LocalDate是一个没有时间的日期。 因此,使用它可以完全消除导致问题的时区问题。 您的字符串2017-11-22采用 ISO 8601 格式, LocalDate将其解析为默认格式,即没有任何显式格式化程序,这也使您的任务更容易。

你的代码出了什么问题?

您的SimpleDateFormat实例默认使用 JVM 的时区设置(可能是亚洲/加尔各答时间),因此将您的日期字符串解析为 Wed Nov 22 2017 00:00:00 GMT+0530 (IST),反过来与 2017 年 11 月 21 日 18:30 UTC 相同的时间点。 LocalDate.fromMillisSinceEpoch()的文档说:“如果给定的数字不对应于整数天,它将被四舍五入到 0。” 换句话说,它四舍五入到 2017-11-21。

如果你真的坚持使用老式的SimpleDateFormat ,祝你好运(对不起,你可能需要它)。 如果是这样,为它分配一个 UTC 时区,它将解析为一个 UTC 日期,无论 JVM 的时区设置如何,您现有的方法都将起作用。

private static final SimpleDateFormat DATE_FORMAT = buildOldfashionedDateFormatInstance();

private static SimpleDateFormat buildOldfashionedDateFormatInstance() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    return dateFormat;
}

链接

类似的东西:

public static LocalDate convertDate(final String date) {
    String[] arr = date.split("-");
    if (arr.length != 3)
        return null;
    return LocalDate.fromYearMonthDay(Integer.parseInt(arr[0]),
            Integer.parseInt(arr[1]),
            Integer.parseInt(arr[2]));
}

我的第一个猜测是,由于您约会的时区,有些混乱。 要检查这一点,只需打印结果的小时和分钟。 如果是 2017-11-21 23:00 之类的,我不会感到惊讶

您可以通过确保日期不会因为“时区差异很小”而改变来简单地修复它。

为了确保您的日期中的几个小时差异不会弄乱您可以执行此操作的那一天(仅当您对日期的时间部分不感兴趣时

替换:

return LocalDate.fromMillisSinceEpoch(d.getTime())

by(增加 12 小时以确保几个小时 +/- 不会改变一天)

return LocalDate.fromMillisSinceEpoch(d.getTime()+1000*60*60*12)

暂无
暂无

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

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