You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:13