【发布时间】:2015-12-27 17:38:04
【问题描述】:
我有一个长号码,格式为:Long l = 20151228;
我想把它解析成 LocalDate 对象。
我该怎么做?
【问题讨论】:
-
使用哪个:Java 8 LocalDate 还是 Joda 的 LocalDate?你试过什么吗?
标签: java java-8 jodatime java-time
我有一个长号码,格式为:Long l = 20151228;
我想把它解析成 LocalDate 对象。
我该怎么做?
【问题讨论】:
标签: java java-8 jodatime java-time
使用java.time,您可以将数字分解为各个部分,并使用静态方法LocalDate.of 从中构建本地日期。
long militaryDate = 20151228L;
LocalDate ld = LocalDate.of((int) (militaryDate / 10000),
Month.of((int) (militaryDate / 100) % 100),
(int) (militaryDate % 100));
System.out.println(ld);
结果:
2015-12-28
【讨论】:
militaryDate 的类型更改为 int,您将摆脱强制转换。
这样做的一种方法是将long 转换为String 并使用SimpleDateFormat 解析它:
long l = 20151228L;
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Date d = df.parse(String.valueOf(l));
【讨论】:
LocalDate 对象。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse( df.format(df.parse(String.valueOf(l)) );
【讨论】:
我建议使用LocalDate::parse(String, DateTimeFormatter),如下所示:
Long l = 20151228L;
LocalDate date = LocalDate.parse(Long.toString(l), DateTimeFormatter.ofPattern("yyyyMMdd"));
System.out.println(date);
结果:
2015-12-28
【讨论】:
我更喜欢 RealSkeptic 的答案,因为它是最有效的答案,但如果您对模运算不满意,我可以为您提供一个替代方案。
您用于日期的整数格式实际上是 BASIC_ISO_DATE 格式。因此,您可以为此使用现有的 java.time 格式化程序:
int dateAsInt = 20151228; // btw no need to use long as it fits easily in an int
LocalDate date = LocalDate.parse(Integer.toString(dateAsInt), DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date);
【讨论】: