如何用java.time格式化时间为2018-03-15T23:47:15+01:00格式?
解决Scala中java.time格式化带"T"的日期时间问题
嘿,我来帮你搞定这个时间格式化的问题,顺便解释下那个"T"的含义!
先说说那个"T"是什么
这个T是ISO 8601国际日期时间标准里规定的分隔符,专门用来区分日期部分(比如2018-03-15)和时间部分(比如23:47:15)。它的作用是让机器能更清晰地解析日期时间字符串,同时让格式成为国际通用的标准格式,避免歧义。
怎么在Scala里生成目标格式
你遇到的无法插入"T"的问题,大概率是两个原因:要么格式化器的模式没写对,要么用错了日期时间类型(比如用了LocalDateTime)。下面一步步解决:
1. 选对日期时间类型
目标格式末尾有+01:00的时区偏移量,而LocalDateTime是不带时区信息的,所以它没法生成这个偏移部分。你需要用带时区的类型:
OffsetDateTime:表示带固定时区偏移的日期时间(比如+01:00)ZonedDateTime:表示带具体时区ID的日期时间(比如Europe/Paris)
2. 用预定义格式化器(最简单的方式)
Java 8的java.time已经提供了刚好匹配你需求的预定义格式化器DateTimeFormatter.ISO_OFFSET_DATE_TIME,直接用就行:
import java.time.OffsetDateTime import java.time.format.DateTimeFormatter // 获取当前带偏移的时间,或者构造你需要的指定时间 val targetTime = OffsetDateTime.parse("2018-03-15T23:47:15+01:00") val formatted = targetTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) // 输出就是你要的:2018-03-15T23:47:15+01:00
3. 自定义格式化器(如果需要自定义规则)
如果你想自己写格式模式,记得把T用单引号括起来(避免被当成格式符解析),模式字符串写成yyyy-MM-dd'T'HH:mm:ssXXX:
import java.time.OffsetDateTime import java.time.format.DateTimeFormatter val customFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX") val targetTime = OffsetDateTime.parse("2018-03-15T23:47:15+01:00") val formatted = targetTime.format(customFormatter) // 同样能得到目标格式
关于LocalDateTime的补充
如果你一定要用LocalDateTime,那得手动给它指定时区偏移才能生成带+01:00的格式,但这其实是绕弯路,不如直接用OffsetDateTime更合理。比如:
import java.time.LocalDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter val localTime = LocalDateTime.parse("2018-03-15T23:47:15") // 给LocalDateTime加上+01:00的偏移,转成OffsetDateTime val offsetTime = localTime.atOffset(ZoneOffset.of("+01:00")) val formatted = offsetTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
内容的提问来源于stack exchange,提问作者Raymond Chenon
相关产品推荐
相关产品推荐

