我想像下面那样转换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
对象构建LocalDateTime
或Parsed
。请注意,如果用户只能输入
yyyy-MM-dd
,并且您将使用这种日期时间格式,则在创建LocalDateTime
时会遇到问题,但我认为您通常知道所需的目标类型。否则,您甚至可以只使用TemporalAccessor
。为了解决特定的日期类型问题,您可能需要处理异常(尝试解析它(或从
from
对象调用Parsed
)并回退到下一个可能的日期格式或类型),或者只是检查事先设置格式,然后使用适当的日期格式和类型,我建议这样做。