如何在LocalDateTime,ZonedDateTime和其他类中选择java8中的Date / Time类?

时间:2018-11-23 08:40:12

标签: java datetime java-8

我想像下面那样转换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之前的代码段中给出)之前(因为它是用户输入),因此无法在我的代码中选择子类。有什么更好的办法吗?

1 个答案:

答案 0 :(得分:1)

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

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)并回退到下一个可能的日期格式或类型),或者只是事先检查格式,然后使用合适的日期格式和类型,这是我所建议的。