Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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_Timezone_Datetime Format_Java Time - Fatal编程技术网

Java 如何根据区域设置获取时区的数据时间模式?

Java 如何根据区域设置获取时区的数据时间模式?,java,timezone,datetime-format,java-time,Java,Timezone,Datetime Format,Java Time,以下代码是我已经拥有的: DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Java_Locale); SimpleDateFormat sf = (SimpleDateFormat) f; String pattern = sf.toPattern(); 通过上面的代码,我能够根据区域设置获得正确的日期/时间模式。例如:美式英语为“M/d/yy h:mm a”,汉语为“yy-M-

以下代码是我已经拥有的:

DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Java_Locale);
SimpleDateFormat sf = (SimpleDateFormat) f;
String pattern = sf.toPattern();
通过上面的代码,我能够根据区域设置获得正确的日期/时间模式。例如:美式英语为“M/d/yy h:mm a”,汉语为“yy-M-d ah:mm”

但是,此模式没有时区信息。我希望能够将时区添加到模式中。例如,“M/d/yy h:mm a z”表示英语,但我不想为其他地区指定模式。我希望根据给定的区域设置获得适当的时区模式,类似于其他区域设置的“M/d/yy h:mm a z”


我使用Java 8。

z
SimpleDataFormat
的有效模式(根据,它是任何语言环境的时区指示符)

唯一的区别是,对于某些值,结果可能取决于区域设置(例如:如果使用
zzzz
,时区
America/Los_Angeles
可以用英语格式化为太平洋夏令时(因为它目前处于夏令时)或者葡萄牙语中的Horário de luz natural do Pacífico
),但是模式
z
本身并不是无效的,无论是在什么地方

getDateTimeInstance
将使用预定义的内置硬编码模式。由于短模式通常不包括时区,您必须手动添加
z

DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.ENGLISH);
SimpleDateFormat sf = (SimpleDateFormat) f;
String pattern = sf.toPattern();

// add z to the format, use the same locale
SimpleDateFormat sdf = new SimpleDateFormat(pattern + " z", Locale.ENGLISH);

Java新的日期/时间API 旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

使用“强> java 8 < /强>时,请考虑使用这更容易

不幸的是,预定义的内置模式仍然是硬编码的,您必须手动添加时区,但至少您可以摆脱上面链接中解释的所有问题:

import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.ZonedDateTime;

// get built-in localized format for a specified locale
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT,
                     FormatStyle.SHORT, IsoChronology.INSTANCE, Locale.ENGLISH);
// create a formatter, add the timezone manually, use same locale
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern + " z", Locale.ENGLISH);
// format a date
System.out.println(fmt.format(ZonedDateTime.now()));
在打印时区时,我使用的是
ZonedDateTime
,它表示特定时区中的日期和时间。有关新日期类型的更多详细信息,请查看

DateTimeFormatter
还有比
SimpleDateFormat
更多的选项。详细信息请查看


如果您仍然需要与
java.util.Date
的互操作性,您可以轻松地将其转换为新的API:

// convert to Instant (UTC)
ZonedDateTime z = new Date().toInstant()
    // convert to some timezone
    .atZone(ZoneId.of("Europe/London"));
API使用的格式(始终为
大陆/城市
,如
美国/圣保罗
欧洲/柏林
)。 避免使用三个字母的缩写(如
CST
PST
),因为它们是

FULL
时间样式包括时区。不过,这将使时间变得更加复杂

注意:仅将
z
添加到模式字符串并不总是准确的。例如,阿拉伯语地区将时区置于日期和时间之间:

Locale Java_Locale = Locale.forLanguageTag("ar");
DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL, Java_Locale);
SimpleDateFormat sf = (SimpleDateFormat) f;
String pattern = sf.toPattern(); // "dd/MM/yy z hh:mm:ss a"

时区是否特定于区域设置?为什么不检索当前时区并添加到已经格式化的字符串中呢?时区可以是Java支持的任何一种,并且它们独立于区域设置。我不确定简单地在格式化模式字符串中添加“z”是否会创建一种适合任何给定区域设置的新格式。是否有原因不使用
java.time
类,如
DateTimeFormatter
?仅供参考,如果您不严格需要本地化格式,您可以考虑使用包括UTC的偏移量的标准格式,进一步通过JavaTimeC类[<代码> ZONDATDATEIMECT/<代码>扩展]来在方括号中追加时区名称。标准格式通常可以跨文化理解。例:
2017-08-22T16:30:48.399-07:00[美国/洛杉矶]
谢谢,肖恩
仅仅在模式字符串中添加一个z并不总是准确的。
-->这正是我所关心的。嗨,Hugo,在模式中添加“z”并不总是准确的,这就是为什么我首先发布这个问题的原因。请看肖恩的回答。非常感谢你详细的回答,这肯定会帮助很多其他人。你好。@curious1没问题。当更改这些预定义的内置格式时,总是有弄乱某些内容的风险。很高兴你找到了答案,祝你好运!
Locale Java_Locale = Locale.forLanguageTag("ar");
DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL, Java_Locale);
SimpleDateFormat sf = (SimpleDateFormat) f;
String pattern = sf.toPattern(); // "dd/MM/yy z hh:mm:ss a"