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

时间:2018-02-05 08:13:14

标签: java date datastax 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

我在这里找不到任何东西?

3 个答案:

答案 0 :(得分:2)

TL; DR

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.time

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

您的代码出了什么问题?

您的SimpleDateFormat实例默认使用JVM的时区设置(可能是亚洲/加尔各答时间),因此会将您的日期字符串解析为相当于2017年11月22日星期三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;
}

链接

答案 1 :(得分:0)

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

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

为了确保您的日期有几个小时的差异,请不要把这一天搞得一团糟(只有当您对日期的时间部分不感兴趣时​​

替换:

return LocalDate.fromMillisSinceEpoch(d.getTime())

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

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

答案 2 :(得分:0)

类似的东西:

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