缺少java.time::toString(字符串模式)方法
考虑以下代码:缺少java.time::toString(字符串模式)方法,java,java-8,jodatime,java-time,Java,Java 8,Jodatime,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 = ZonedDateT
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时间类(DateTime
,LocalDate
等)包含一个toString
方法,该方法接受所需格式的字符串。这是一个非常方便的方法。然而,java-8实现忽略了这个方法。相反,您需要调用格式(DateTimeFormatter formatter)
当然是一个小小的抱怨。但是我的问题是:是否有任何原因在java.time中省略了这一点?由于这个小小的遗漏,将我的应用程序从joda time转换为java.time将非常困难。但是,如果有逻辑上的原因,我同意。并不是说你来这里是为了缓解我的担忧,而是我想我会问一下以防万一
编辑:对亲密的选民来说,这不是一个基于意见的问题。任何熟悉joda time/java.time的内部工作原理及其以特定方式开发的动机的人都有资格回答这个问题,即使他们从来没有这样做过。我说的任何话都是猜测,因为你必须与新的日期时间API的作者交谈才能真正找到答案 我猜他们决定使用格式化程序,因为它在语义上更合适,更符合您实际尝试的操作:为特定区域设置日期格式。即使
toString
采用了一种模式,签名toString(String)
也不是完全直观的。此外,与重载对象#toString
相比,使用专用方法处理日期格式可能更好。这无疑是一个更干净的API
再次,正如我所说,这是猜测,所以要得到真正的答案,你必须去源头。但是如果我是这样做的,这就是我的理由。格式选择的决定性优势是可以共享单个DateTimeFormatter(这不是旧的不可拆分的、不线程安全的DateFormatter) API报价: 从模式创建的格式化程序可以被多次使用 必要时,它是不可变的,并且是线程安全的 两者都不具备是API设计中的清洁问题 因此,此API可用于编写:
final DateTimeFormatter DTF =
DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss a z"));
...
System.out.println(ldt.format(DTF));
一个有趣的问题。Joda Time和java.Time(JSR-310)有不同的设计中心——Joda Time是一个开源库,但java.Time是JDK的扩展。一个实际的含义是对方法计数施加更大的压力,这是这里的一个因素 Joda Time中讨论的方法是四种方法之一:
toString()
toString(DateTimeFormatter dtf)
toString(字符串模式)
toString(字符串模式、区域设置位置)
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内部评论建议将该方法重命名为格式(DateTimeFormatter)
注意,joda time仍然是一个非常棒的库,没有真正的理由(除非您需要节省.jar
的500KB存储空间)来切换。这是java.time
的主要目的,为了防止新项目需要joda时间?@ryvantagejava.time
的作者是JodaTime的作者。所以我要说,java.time
是JodaTime的精神继承者。@ryvantage TBH,这是一个基于观点的问题,因为没有真正的答案(除非真正的作者插话)。我们只是在猜测。我问这个问题的确切原因是:如果同一个作者同时写了这两个,那么他一定有理由省略这个方法。我只是想知道为什么。所以,实用性(更少的方法,没有缓存)与方便性相比,实用性对JDK来说胜出了。谢谢很高兴直接听到消息来源。