Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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时间通过语言标记获得的任何区域设置来格式化日期?_Java_Date_Time_Java 8_Java Time - Fatal编程技术网

如何使用java时间通过语言标记获得的任何区域设置来格式化日期?

如何使用java时间通过语言标记获得的任何区域设置来格式化日期?,java,date,time,java-8,java-time,Java,Date,Time,Java 8,Java Time,我想得到一个日期作为字符串和一个语言标记,并基于此按区域设置格式解析字符串 这就是我到目前为止所做的: public static String formatDateByLocale(String date, String languageTag) { Locale locale = Locale.forLanguageTag(languageTag); String datePattern = DateTimeFormatterBuilder.getLocalizedDateT

我想得到一个日期作为字符串和一个语言标记,并基于此按区域设置格式解析字符串

这就是我到目前为止所做的:

public static String formatDateByLocale(String date, String languageTag) {
    Locale locale = Locale.forLanguageTag(languageTag);
    String datePattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.LONG, FormatStyle.LONG, Chronology.ofLocale(locale), locale);

    DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern(datePattern).withLocale(locale);
    DateTimeFormatter currentFormat = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a");

    LocalDateTime localDateTime = LocalDateTime.parse(date, currentFormat);

    String result = targetFormat.format(localDateTime);


    return result;
}
这将抛出
无法提取值:class java.time.LocalDateTime

我应该如何将日期:2017年4月17日上午10:50,FR标签转换为2017年4月17日上午10:50?

建议的解决方案 将您的
日期模式
替换为
“yyyy/MM/dd hh:MM a”

提议的解决办法 将您的
日期模式
替换为
“yyyy/MM/dd hh:MM a”


你的例子不完整,也不正确。你应该提供一份报告。您2017年4月17日上午10:50时的示例输出与法语的实际输出根本不接近。因此,我们无法准确回答。但这里有一些东西给你指出了正确的方向

您不能指望能够解析任何日期时间输入字符串。有些模棱两可的问题是无法解决的。一些关键信息,如UTC或时区的偏移量可能会被忽略。相反:

  • 在应用程序中,传递java.time对象,而不仅仅是字符串
  • 在应用程序/系统之间,传递字符串是标准格式。一般来说,对于日期时间值,请使用UTC
下面是一些示例代码,显示了所需的法语输出

以UTC格式将当前时刻捕获为
瞬间

Instant instant = Instant.now( );
调整到特定的时区。请记住,时区与本地化问题无关

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
确定
区域设置
。在这里,我们使用法国文化规范的法语

Locale locale = Locale.forLanguageTag( "fr-FR" );
您的问题显示了在适当的位置交换区域设置。由于
即时
和法国使用,因此在此处无效

定义格式化程序。不需要问题中提到的构建器模式

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale ).withChronology( c ) ;
生成输出

String s = zdt.format( f );
转储到控制台

System.out.println( "instant.toString(): " + instant + " at zone: " + z + " in chrono: " + c + " = " + s );
instant.toString():2017-11-23T04:30:45.091424Z所在区域:亚洲/加尔各答时间:ISO=23/11/2017 10:00

请注意,此输出无法解析回日期时间值,因为它缺少关键信息

在本例中,您可以将字符串解析为
LocalDateTime
,如问题所示。但这里有数据丢失。
LocalDateTime
故意没有偏移或分区的概念,因此它不表示时间线上的某个点。
LocalDateTime
不是一个实际的时刻,只是在大约26-27小时内可能发生的一系列可能时刻的模糊提示。你甚至还没有接近你的起点

LocalDateTime ldt = LocalDateTime.parse( s , f );
System.out.println( "ldt: " + ldt );
ldt.toString():2017-11-23T10:00


顺便说一下,我建议您的方法使用一个而不仅仅是一个语言标记字符串。调用的程序员应负责确定有效语言标记的完整
区域设置。语言标记及其变体是一项复杂的业务。调用的程序员应该通过成功地实例化
区域设置
(理想情况下,测试它)来验证他们是否正确定义了有效的语言构造。这里的方法应该关注日期-时间问题,而不必同时处理语言标记的复杂性。

您的示例不完整且不正确。你应该提供一份报告。您2017年4月17日上午10:50时的示例输出与法语的实际输出根本不接近。因此,我们无法准确回答。但这里有一些东西给你指出了正确的方向

您不能指望能够解析任何日期时间输入字符串。有些模棱两可的问题是无法解决的。一些关键信息,如UTC或时区的偏移量可能会被忽略。相反:

  • 在应用程序中,传递java.time对象,而不仅仅是字符串
  • 在应用程序/系统之间,传递字符串是标准格式。一般来说,对于日期时间值,请使用UTC
下面是一些示例代码,显示了所需的法语输出

以UTC格式将当前时刻捕获为
瞬间

Instant instant = Instant.now( );
调整到特定的时区。请记住,时区与本地化问题无关

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
确定
区域设置
。在这里,我们使用法国文化规范的法语

Locale locale = Locale.forLanguageTag( "fr-FR" );
您的问题显示了在适当的位置交换区域设置。由于
即时
和法国使用,因此在此处无效

定义格式化程序。不需要问题中提到的构建器模式

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale ).withChronology( c ) ;
生成输出

String s = zdt.format( f );
转储到控制台

System.out.println( "instant.toString(): " + instant + " at zone: " + z + " in chrono: " + c + " = " + s );
instant.toString():2017-11-23T04:30:45.091424Z所在区域:亚洲/加尔各答时间:ISO=23/11/2017 10:00

请注意,此输出无法解析回日期时间值,因为它缺少关键信息

在本例中,您可以将字符串解析为
LocalDateTime
,如问题所示。但这里有数据丢失。
LocalDateTime
故意没有偏移或分区的概念,因此它不表示时间线上的某个点。
LocalDateTime
不是一个实际的时刻,只是在大约26-27小时内可能发生的一系列可能时刻的模糊提示。你甚至还没有接近你的起点

LocalDateTime ldt = LocalDateTime.parse( s , f );
System.out.println( "ldt: " + ldt );
ldt.toString():2017-11-23T10:00


顺便说一下,我建议您的方法使用一个而不仅仅是一个语言标记字符串。调用的程序员应负责确定有效语言标记的完整
区域设置。语言标记及其变体是一项复杂的业务。调用的程序员应该通过成功地实例化
区域设置
(理想情况下,测试它)来验证他们是否正确定义了有效的语言构造。这里的方法应该关注日期时间问题,而不必同时处理语言标记的复杂性。

@GrzegorzGórkiewicz,这个答案与
java.time
无关。的确如此。以及