我想像下面那样转换Java8之前的版本。

DateFormat formatter = new SimpleDateFormat(timestampPattern, locale);
Date dt = formatter.parse(timestamp);
Date currentDateTime = getCurrentTime();


以Java 8代码支持的毫秒数超过3位。我找到了使用以下简单代码实现此目的的方法。

String parsedate="2016-03-16 01:14:21.6739";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS");
LocalDateTime newdate = LocalDateTime.parse(parsedate, dateTimeFormatter);


上面的代码的问题是,您必须在解析特定类之前就知道特定的类,例如,如果其中仅包含日期,则必须使用LocalDate;如果仅使用时间LocalTime,并且如果必须使用日期+时间+区域,则必须使用ZonedDateTime。

我的问题是我不知道timestampPattern或timestamp(在Java8之前的代码段中给出)之前(因为它是用户输入),因此无法在我的代码中选择子类。有什么更好的办法吗?

最佳答案

以下代码将向您展示如何处理它:

String parsedate="2016-03-16 01:14:21.6739";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS");
TemporalAccessor parsed = dateTimeFormatter.parse(parsedate);
System.out.println(parsed.getClass());
// with the Parsed object you can then construct what you require... e.g. LocalDate:
System.out.println(LocalDate.from(parsed));
// or LocalDateTime:
System.out.println(LocalDateTime.from(parsed));


打印:

class java.time.format.Parsed
2016-03-16
2016-03-16T01:14:21.673900


因此,您只需要使用代码中需要的内容,并从LocalDate对象构建LocalDateTimeParsed

请注意,如果用户只能输入yyyy-MM-dd,并且您将使用这种日期时间格式,则在创建LocalDateTime时会遇到问题,但我认为您通常知道所需的目标类型。否则,您甚至可以只使用TemporalAccessor

为了解决特定的日期类型问题,您可能需要处理异常(尝试解析它(或从from对象调用Parsed)并回退到下一个可能的日期格式或类型),或者只是检查事先设置格式,然后使用适当的日期格式和类型,我建议这样做。

09-30 17:30