能否用ISODateTimeFormat将joda.time.DateTime转为yyyy-MM-dd HH:mm:ss格式?
关于Joda-Time中ISODateTimeFormat的格式问题
首先明确说:ISODateTimeFormat没办法直接输出你想要的yyyy-MM-dd HH:mm:ss格式,因为它是严格遵循ISO 8601标准的工具类,而ISO标准里的日期时间分隔符是T(比如2019-11-28T00:00:00),并且默认会带上时区偏移信息,这就是你得到2019-11-28T00:00:00.000+03:00的原因。
你用withTimeAtStartOfDay已经正确把时间部分设置为当天起始点了,问题出在格式化工具的选择上。
可行的方案对比
你目前用DateTimeFormat.forPattern的方式其实已经是非常直接且推荐的方案,可读性和维护性都很好。如果想优化,可以把格式化器定义为常量,避免重复创建实例:
// 定义为全局常量,复用更高效 private val START_OF_DAY_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") val dateTime: DateTime = new DateTime().minusDays(1).withTimeAtStartOfDay println(START_OF_DAY_FORMATTER.print(dateTime)) // 输出 2019-11-28 00:00:00
如果一定要尝试基于ISODateTimeFormat的方式,只能做一些字符串替换的 hack 操作,但这种方式并不推荐,因为不够直观,还可能引入时区相关的额外问题:
val isoFormatter = ISODateTimeFormat.dateHourMinuteSecond() // 替换ISO格式中的'T'为空格 val formatted = isoFormatter.print(dateTime).replace('T', ' ')
另外,如果你不需要时区信息,也可以先转换为LocalDate再转成起始时间的LocalDateTime,再格式化,效果和之前一致:
val localStartDateTime = dateTime.toLocalDate.toLocalDateTime(LocalTime.MIDNIGHT) println(START_OF_DAY_FORMATTER.print(localStartDateTime))
总结
ISODateTimeFormat的设计目标是生成符合ISO 8601标准的字符串,所以无法直接满足你的格式需求。你当前使用DateTimeFormat自定义格式的方案就是最优解之一,清晰、高效且符合你的需求。
内容的提问来源于stack exchange,提问作者samba
相关产品推荐
相关产品推荐

