Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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
Java8相当于JodaTime DateTimeFormat.shortDate()_Java_Java 8_Jodatime_Java Time_Date Parsing - Fatal编程技术网

Java8相当于JodaTime DateTimeFormat.shortDate()

Java8相当于JodaTime DateTimeFormat.shortDate(),java,java-8,jodatime,java-time,date-parsing,Java,Java 8,Jodatime,Java Time,Date Parsing,java8java.time的等价物是什么 org.joda.time.formatDateTimeFormat.shortDate() 我尝试了下面的方法,但它无法解析值,例如20/5/2016或20/5/16 DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) FormatStyle.SHORT返回最短的格式,即dd/MM/yy或d/M/yy格式,因此您需要使用pattern来获取自定义格式 LocalDate date = Loc

java8java.time的等价物是什么

org.joda.time.formatDateTimeFormat.shortDate()
我尝试了下面的方法,但它无法解析值,例如20/5/2016或20/5/16

DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) 
FormatStyle.SHORT返回最短的格式,即dd/MM/yy或d/M/yy格式,因此您需要使用pattern来获取自定义格式

LocalDate date = LocalDate.now();   
System.out.println(date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)));   //9/29/19
您还可以使用DateTimeFormatter.ISO_DATE或DateTimeFormatter.ISO_LOCAL_DATE来获取ISO格式,如yyyy MM dd,您还可以在中查看可用的格式

如果您想要像yyyy/MM/dd这样的自定义格式,请使用模式

FormatStyle.SHORT返回最短的格式,即dd/MM/yy或d/M/yy格式,因此您需要使用pattern来获取自定义格式

LocalDate date = LocalDate.now();   
System.out.println(date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)));   //9/29/19
您还可以使用DateTimeFormatter.ISO_DATE或DateTimeFormatter.ISO_LOCAL_DATE来获取ISO格式,如yyyy MM dd,您还可以在中查看可用的格式

如果您想要像yyyy/MM/dd这样的自定义格式,请使用模式


您是对的:Joda Time DateTimeFormatter是您从DateTimeFormat.shortDate获得的类型,它的解析比java.Time DateTimeFormatter更为轻松。在英语/新西兰地区,en NZ shortDate使用格式模式d/MM/yy,并将2016年5月20日和2016年5月20日解析为2016-05-20

坦率地说,我觉得它把两位数和四位数的年份都解释为同一年是令人讨厌的。当格式指定两位数的年份时,我希望四位数对于更严格的输入验证是一个错误。当格式指定两位数时,接受一位数的月份也是宽松的,但可能没有那么危险,更符合我们的预期

time也使用jdk-11.0.3上测试的格式模式d/MM/yy。当解析为时,接受一个或两个数字表示月份的日期,但坚持使用两个数字表示月份和两个数字表示年份

您可以在java.Time中获得Joda Time行为,但它要求您自己指定格式模式:

    Locale loc = Locale.forLanguageTag("en-NZ");
    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("d/M/[yyyy][yy]", loc);

    System.out.println(LocalDate.parse("20/5/2016", dateFormatter));
    System.out.println(LocalDate.parse("20/5/16", dateFormatter));
输出为:

如果您想要一个在其他地区工作的高级解决方案,我相信您可以编写一段代码,从DateTimeFormatterBuilder.getLocalizedDateTimePattern获取格式模式,并通过将dd替换为d、MM替换为M、将任意数量的y替换为[yyyy][yy]对其进行修改。然后将修改后的格式模式字符串传递给DateTimeFormatter.ofPattern

编辑:我很高兴你有工作要做。您在评论中说您使用了:

    Stream<String> shortFormPatterns = Stream.of(
            "[d][dd]/[M][MM]",
            "[d][dd]-[M][MM]",
            "[d][dd].[M][MM]",
            "[d][dd] [M][MM]",
            "[d][dd]/[M][MM]/[yyyy][yy]",
            "[d][dd]-[M][MM]-[yyyy][yy]",
            "[d][dd].[M][MM].[yyyy][yy]",
            "[d][dd] [M][MM] [yyyy][yy]");
它涵盖了更多的情况下,你的乔达时间格式化程序。也许这很好。具体来说,您的Joda时间格式化程序坚持在数字之间使用斜杠/分隔符,并拒绝使用连字符、点或空格。我也相信《时代》杂志会反对把这一年完全排除在外。 虽然您确实需要[yyy][yy],但不需要[d][dd]或[M][MM]。只要d和M就足够了,因为它们也接受两位数字。例如,代码中发生的情况是[d]解析一位或两位数字,因此永远不会使用[dd]。 如果您只喜欢一种格式模式字符串,我希望d[/][-][.][.][-][.][.][-][.][.][.][.][.][.][.][.[.]][YYY][yy]可以工作,除非在省略年份的情况下我没有测试。
您是对的:Joda Time DateTimeFormatter是您从DateTimeFormat.shortDate获得的类型,它的解析比java.Time DateTimeFormatter更为轻松。在英语/新西兰地区,en NZ shortDate使用格式模式d/MM/yy,并将2016年5月20日和2016年5月20日解析为2016-05-20

坦率地说,我觉得它把两位数和四位数的年份都解释为同一年是令人讨厌的。当格式指定两位数的年份时,我希望四位数对于更严格的输入验证是一个错误。当格式指定两位数时,接受一位数的月份也是宽松的,但可能没有那么危险,更符合我们的预期

time也使用jdk-11.0.3上测试的格式模式d/MM/yy。当解析为时,接受一个或两个数字表示月份的日期,但坚持使用两个数字表示月份和两个数字表示年份

您可以在java.Time中获得Joda Time行为,但它要求您自己指定格式模式:

    Locale loc = Locale.forLanguageTag("en-NZ");
    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("d/M/[yyyy][yy]", loc);

    System.out.println(LocalDate.parse("20/5/2016", dateFormatter));
    System.out.println(LocalDate.parse("20/5/16", dateFormatter));
输出为:

如果您想要一个在其他地区工作的高级解决方案,我相信您可以编写一段代码,从DateTimeFormatterBuilder.getLocalizedDateTimePattern获取格式模式,并通过将dd替换为d、MM替换为M、将任意数量的y替换为[yyyy][yy]对其进行修改。然后将修改后的格式模式字符串传递给DateTimeFormatter.ofPattern

编辑:我很高兴你有工作要做。您在评论中说您使用了:

    Stream<String> shortFormPatterns = Stream.of(
            "[d][dd]/[M][MM]",
            "[d][dd]-[M][MM]",
            "[d][dd].[M][MM]",
            "[d][dd] [M][MM]",
            "[d][dd]/[M][MM]/[yyyy][yy]",
            "[d][dd]-[M][MM]-[yyyy][yy]",
            "[d][dd].[M][MM].[yyyy][yy]",
            "[d][dd] [M][MM] [yyyy][yy]");
它涵盖了更多的情况下,你的乔达时间格式化程序。也许这很好。具体来说,您的Joda时间格式化程序坚持在数字之间使用斜杠/分隔符,并拒绝使用连字符、点或空格。我也相信《时代》杂志会反对把这一年完全排除在外。 虽然您确实需要[yyy][yy],但不需要[d][dd]或[M][MM]。只要d和M就足够了,因为它们也接受两位数字。代码中发生的是th 例如,[d]解析一个或两个数字,因此无论如何都不会使用[dd]。 如果您只喜欢一种格式模式字符串,我希望d[/][-][.][.][-][.][.][-][.][.][.][.][.][.][.][.[.]][YYY][yy]可以工作,除非在省略年份的情况下我没有测试。
问题是我不知道输入的格式是什么。JodaTime shortDate似乎比java.time FormatStyle.SHORT涵盖了更多的案例。@wilmol,请问是什么案例?从文档DateTimeFormatter.ofLocalizedDateFormatStyle.SHORT似乎等同于DateTimeFormat.shortDate。我不太了解Joda的时间,所以我可能遗漏了一些东西。问题是我不知道输入的格式是什么。JodaTime shortDate似乎比java.time FormatStyle.SHORT涵盖了更多的案例。@wilmol,请问是什么案例?从文档DateTimeFormatter.ofLocalizedDateFormatStyle.SHORT似乎等同于DateTimeFormat.shortDate。我不太了解乔达的时间,所以我可能错过了一些东西。是的,[]工作得很好。我只使用Stream shortFormPatterns=Stream.of[d][dd]/[M][MM],[d][dd][M][MM],[d][dd][M][MM],[d][dd/[M][MM]/[yyyy][yy],[d][MM]-[yyyyy][MM],[yyyyyy][yy][d][dd M][yyyyy];可能比joda.time更详细,后者隐式支持更多的案例,但java.time在其他方面更好。谢谢@wilmol的跟进。我有两点意见。我已将它们作为编辑添加到我的答案底部。@OleV.V。d[/][-][.][.][-][.][.][.][.][.][.][.][.][.][.[.][.][.[.][.[.][.[.][.[.[.][.[.][.[.[.[。至少对于2016年5月20日、2016年5月20日、2009年12月31日、2017年3月21日、19年2月9日、2015年2月20日、09年3月16日之类的投入来说,是的,[]工作得很好。我只使用Stream shortFormPatterns=Stream.of[d][dd]/[M][MM],[d][dd][M][MM],[d][dd][M][MM],[d][dd/[M][MM]/[yyyy][yy],[d][MM]-[yyyyy][MM],[yyyyyy][yy][d][dd M][yyyyy];可能比joda.time更详细,后者隐式支持更多的案例,但java.time在其他方面更好。谢谢@wilmol的跟进。我有两点意见。我已将它们作为编辑添加到我的答案底部。@OleV.V。d[/][-][.][.][-][.][.][.][.][.][.][.][.][.][.[.][.][.[.][.[.][.[.][.[.[.][.[.][.[.[.[。至少针对2016年5月20日、2016年5月20日、2009年12月31日、2017年3月21日、19年2月9日、2015年2月20日、09年3月16日等投入。