ryv*_*age 2 java jodatime java-8 java-time
请考虑以下代码:
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)));
}
Run Code Online (Sandbox Code Playgroud)
joda-time类(DateTime,LocalDate等)包含一个toString接受所需格式的String的方法.这是一种非常方便的方法.然而,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(String pattern)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);
}
Run Code Online (Sandbox Code Playgroud)
最后,最初调用JSR-310中的方法toString(DateTimeFormatter).Oracle内部审核建议将方法重命名为format(DateTimeFormatter).
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |