考虑以下代码:
public static void main(String[] args) {
String pattern = "MMM dd, yyyy HH:mm:ss a z";
// joda-time
DateTime dt = DateTime.now();
System.out.println(dt.toString(pattern));
// java.time
ZonedDateTime ldt = ZonedDateTime.now();
System.out.println(ldt.toString(pattern)); // doesn't exist
System.out.println(ldt.format(DateTimeFormatter.ofPattern(pattern)));
}
joda-time 类(DateTime
、LocalDate
等)包含一个 toString
方法,它接受您想要的格式的字符串。这是一个非常方便的方法。然而,java-8 实现省略了这个方法。相反,您需要调用 format(DateTimeFormatter formatter)
。
一个小提示,当然。但我的问题是:是否有任何原因将其从 java.time 中省略?由于这个小遗漏,将我的应用程序从 joda-time 转换为 java.time 将变得更加困难。但是,如果有合乎逻辑的原因,我可以接受。并不是说您来这里是为了消除我的顾虑,而是我想我会问以防万一。
编辑:对于接近选民的人来说,这不是一个基于意见的问题。任何熟悉 joda-time/java.time 的内部工作原理及其以某种方式开发的动机的人都有资格回答这个问题,即使他们从未回答过。
最佳答案
一个有趣的问题。 Joda-Time 和 java.time (JSR-310) 有不同的设计中心——Joda-Time 是一个开源库,而 java.time 是对 JDK 的扩展。一个实际意义是方法计数的压力更大,这是这里的一个因素。
Joda-Time 中的方法是以下四种之一:
toString()
toString(DateTimeFormatter dtf)
toString(字符串模式)
toString(String pattern, Locale loc)
第一个是 Java 中的标准方法,因此默认包含在内。基于格式化程序的方法很方便,因为您可以只使用格式化程序本身。这两种基于模式的方法更加方便,因为它们只是创建一个格式化程序。
但是请注意,基于模式的方法需要两种变体,一种带有区域设置,一种不带区域设置,而格式化程序在内部嵌入了区域设置(因此不需要方法变体)。在考虑 JSR-310 时,对额外语言环境方法的需求很重要。
另一个考虑因素是缓存/性能。 Joda-Time 有一个格式缓存模式,以避免重新解析像“yyyy-MM-dd”这样的模式。这种缓存在 JDK 中不太受欢迎,因此希望找到一种没有缓存的方法。
对于使用 java.time 的格式化程序,推荐的方法是将它们分配给静态变量。新的格式化程序是线程安全的(与旧的不同),因此效果很好。此外,为格式化程序定义一个常量意味着模式的解析只发生一次——常量存储准备格式化/解析的内部数据结构。
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss a z");
public static void main(String[] args) {
ZonedDateTime ldt = ZonedDateTime.now();
System.out.println(ldt.format(FORMATTER);
}
最后,JSR-310 中的方法最初称为toString(DateTimeFormatter)
。 Oracle 内部审查建议将该方法重命名为 format(DateTimeFormatter)
。
关于缺少 java.time::toString(String pattern) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22792509/