Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缺少java.time::toString(字符串模式)方法_Java_Java 8_Jodatime_Java Time - Fatal编程技术网

缺少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(字符串模式、区域设置位置)
第一种方法是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内部评论建议将该方法重命名为
格式(DateTimeFormatter)

注意,joda time仍然是一个非常棒的库,没有真正的理由(除非您需要节省
.jar
的500KB存储空间)来切换。这是
java.time
的主要目的,为了防止新项目需要joda时间?@ryvantage
java.time
的作者是JodaTime的作者。所以我要说,
java.time
是JodaTime的精神继承者。@ryvantage TBH,这是一个基于观点的问题,因为没有真正的答案(除非真正的作者插话)。我们只是在猜测。我问这个问题的确切原因是:如果同一个作者同时写了这两个,那么他一定有理由省略这个方法。我只是想知道为什么。所以,实用性(更少的方法,没有缓存)与方便性相比,实用性对JDK来说胜出了。谢谢很高兴直接听到消息来源。