将15位数字字符串转换为java8时间戳

时间:2016-08-19 00:28:25

标签: datetime java-8 type-conversion date-formatting

我正在努力将一个大的15位数字符串转换为日期格式。

示例代码:

String dateInString = "201410051252323";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ");
LocalDateTime dateTime = LocalDateTime.parse(dateInString, formatter);

我遇到了异常

java.time.format.DateTimeParseException: Text '2014100591523' could not be parsed at index 0

任何人都可以建议在Java 8中执行此操作的最佳方法

1 个答案:

答案 0 :(得分:1)

你有正确的想法,但你的代码有两个问题 - 一个语法,另一个是后勤:

  • 您的模式需要使用连字符和冒号和空格格式化字符串。例如," yyyy-MM-dd"将匹配" 2014-10-05",但不是" 20141005"。要匹配后者,只需删除连字符并使用" yyyyMMdd"。
  • 你使用' Z'在最终数字的模式中,表示您期望字符串中的时区偏移。但是' Z'模式匹配偏移量,如" + 0000"和" -8000",而不是一个数字。另外,要使用时区表示日期时间,您应该使用ZonedDateTimeOffsetDateTime类而不是LocalDateTime

我不确定' 3'在你的示例字符串中应该表示,如果确实应该表示区域偏移。如果您无法控制数据集的格式,则必须剥离最终数字并单独处理。


    String dateInString = "201410051252323";
    String dateTimeString = dateInString.substring(0, 14); // "20141005125232"
    String zoneDigitString = dateInString.substring(14); // "3"
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); // no "Z" 
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);

    /* Manually convert zoneDigitString to a ZoneId here */
    ZoneId zone = ...; 

    ZonedDateTime zonedDateTime = dateTime.atZone(zone);

你必须处理" ..."部分靠你自己,取决于" 3"表示。