Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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中解析日期时间字符串是否需要'Locale'? 在什么条件下,我需要一个解析Java中日期时间字符串的方法 语言环境与语言环境有什么关系_Java_Date_Datetime_Java Time - Fatal编程技术网

在Java中解析日期时间字符串是否需要'Locale'? 在什么条件下,我需要一个解析Java中日期时间字符串的方法 语言环境与语言环境有什么关系

在Java中解析日期时间字符串是否需要'Locale'? 在什么条件下,我需要一个解析Java中日期时间字符串的方法 语言环境与语言环境有什么关系,java,date,datetime,java-time,Java,Date,Datetime,Java Time,有时我会看到一些问题和答案,这些问题和答案是解析问题的解决方案所需要的区域设置。然而,在另一些书中,却没有提到语言环境 区域设置和时区不相关 区域设置和时区是独立的,与日期时间处理有关的问题 区域设置 语言人类语言,如。星期几、月份和的名称文本。例如,今天是星期一还是隆迪 文化常用习惯用法,用于排列组成日期时间值字符串表示形式的文本和数字片段。例如……简而言之,是月-日-年,日-月-年,还是年-月-日?从长远来看,一周中的哪一天是第一天?月份名称的首字母是大写还是全小写?缩写词是否有字符

有时我会看到一些问题和答案,这些问题和答案是解析问题的解决方案所需要的区域设置。然而,在另一些书中,却没有提到语言环境

区域设置和时区不相关 区域设置和时区是独立的,与日期时间处理有关的问题

  • 区域设置
    • 语言
      人类语言,如。星期几、月份和的名称文本。例如,今天是星期一还是隆迪
    • 文化
      常用习惯用法,用于排列组成日期时间值字符串表示形式的文本和数字片段。例如……简而言之,是
      月-日-年
      日-月-年
      ,还是
      年-月-日
      ?从长远来看,一周中的哪一天是第一天?月份名称的首字母是大写还是全小写?缩写词是否有字符
  • 时区
    • 偏移量
      一个地区的人们使用的时间与()之间的小时和分钟差,后者是世界调节时钟和时间的主要时间标准
    • 异常
      抵销变更的历史记录、定义抵销的当前应用规则,包括调整,以及近期变更的确认计划
因此,您可以混合和匹配地区和时区。下面是一些例子

  • 一名法国男子在印度浦那参加一个会议,他需要在印度的墙上看到会议日程安排,但他更愿意把“星期一”读成他的母语法语“伦迪”。
    • 法国地区
    • 印度时区
  • 一名在西雅图工作的巴西工程师想观看芬兰图尔库的现场网络研讨会。她需要知道何时将她的网络浏览器指向网络研讨会。在适应西雅图时区后,她需要知道芬兰的开始时间,但要用她的母语葡萄牙语显示巴西的地区。
    • 表示语言环境(“pt”、“BR”)(用于生成文本表示)
    • 芬兰的计划开始时间必须从
      欧洲/赫尔辛基
      调整为
      美国/洛杉矶
      (西雅图时区)
  • 冰岛的一家报纸可能会将发生在俄罗斯的事件报道为两个日期时间,莫斯科时区,为清楚起见,添加UTC时区。但文章将使用冰岛语作为文本,包括星期一。
    • 莫斯科时区和冰岛地区
    • UTC时区和冰岛地区
分析/生成作为日期时间值的文本表示形式的字符串时,仅在两种情况下使用区域设置:

  • 星期日名称和/或月份名称(或顺序指标,但最好避免)
  • 软编码、本地化格式
在第一种情况下,如果字符串包含“Monday”/“Lundi”或“March”/“Mars”之类的词,则使用区域设置来翻译这些字符串

在第二种情况下,如果没有明确的格式模式,则使用区域设置来了解星期几、日期、月份名称、年份等部分的预期顺序。例如,说英语的美国人说“10月11日”,说法语的加拿大人则使用“11 octobre”的相反顺序。所谓软编码,我们指的是类似于与硬编码格式类似的东西

那么什么时候不需要语言环境呢?如果您有一个包含所有数字的输入字符串,如“2015-01-23”,并且您正在硬编码格式为“yyyy-MM-dd”

…那么区域设置实际上是不相关的。你没有要翻译的单词,没有“星期一”或“伦迪”。而且,我们也不要求使用本地化的格式化程序,因为它需要一个区域设置来知道日期是在月份之前还是之后,以及其他类似的细节

请注意,在这种情况下仍然可以指定区域设置。事实上,我建议您养成一种习惯,总是指定地区(以及时区)

隐式语言环境和时区 那么,为什么在没有任何区域设置的StackOverflow上看到这么多与日期时间相关的问题和答案呢?因为如果省略,JVM的当前默认区域设置将自动且静默地应用

因此,如果您有一个在JVM上运行的带有英文文本的字符串设置为US locale,那么就没有问题了。但这种对隐式语言环境的依赖是不推荐的。如果在运行时调用任何应用程序的任何线程中的任何代码,并影响该JVM中的所有其他代码。然后您的代码抛出一个异常。最好养成明确指定预期/所需语言环境的习惯

时区也有同样的建议。如果省略,JMV的当前默认时区将自动且静默地应用。同样,运行时任何应用程序的任何线程中的任何代码都可以调用,并影响该JVM中的所有其他代码。然后您的代码抛出异常或行为异常

运行时的意外更改应该足以让您养成同时指定语言环境和时区的习惯。但另一个好处是,它还可以使代码自文档化。此外,编程时有意识地指定区域设置和时区可能会提醒您错误或未经证实的假设

示例场景 想象一下魁北克的一位商人。她向土耳其的一位客户确认了他中午交货的情况。因此,她使用墙时间创建了一个对象,在土耳其,交付将被接受

ZoneId zoneIdIstanbul = ZoneId.of( "Europe/Istanbul" );
ZonedDateTime zdtIstanbul = ZonedDateTime.of( 2015, 10, 11, 12, 30, 00, 0, zoneIdIstanbul );  // Half-past noon in Turkey.
为了方便客户,她使用和习惯设置文本格式。她定义了一个格式化程序对象来处理日期时间值的文本表示的生成。我们还可以为要创建的格式化程序分配一个时区
ZoneId zoneIdIstanbul = ZoneId.of( "Europe/Istanbul" );
ZonedDateTime zdtIstanbul = ZonedDateTime.of( 2015, 10, 11, 12, 30, 00, 0, zoneIdIstanbul );  // Half-past noon in Turkey.
Locale locale_tr_TR = new Locale( "tr", "TR" );
DateTimeFormatter formatter_tr_TR = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale_tr_TR );
String outputTurkish = formatter_tr_TR.format( zdtIstanbul );
Locale locale_fi_FI = new Locale( "fi", "FI" );
DateTimeFormatter formatter_fi_FI = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale_fi_FI );
String outputFinnish = formatter_fi_FI.format( zdtIstanbul );
Locale locale_fr_CA = Locale.CANADA_FRENCH;
ZoneId zoneId_Montréal = ZoneId.of( "America/Montreal" );
DateTimeFormatter formatter_fr_CA_Adjusted = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale_fr_CA ).withZone( zoneId_Montréal );
String outputQuébec = formatter_fr_CA_Adjusted.format( zdtIstanbul );
Locale locale_en_US = Locale.US;
DateTimeFormatter formatter_US_Unadjusted = formatter_fr_CA_Adjusted.withLocale( locale_en_US );
String output_US_Unadjusted = formatter_US_Unadjusted.format( zdtIstanbul );
System.out.println( "zdtIstanbul : " + zdtIstanbul );
System.out.println( "outputTurkish : " + outputTurkish );
System.out.println( "outputFinnish : " + outputFinnish );
System.out.println( "outputQuébec : " + outputQuébec );
System.out.println( "output_US_Unadjusted : " + output_US_Unadjusted );