我试图将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
我在这里找不到任何东西?
答案 0 :(得分:2)
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日期和时间类Date
和SimpleDateFormat
已经过时且设计不佳,后者尤其难以解决。此外,现代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]));
}