关于java:如何在SimpleDateFormat中将Z设置为时区

How to set Z as timezone in SimpleDateFormat

代码示例:

1
2
3
4
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
System.out.println(dateFormat.getTimeZone());
System.out.println(dateFormat.parse(time));
//  dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));

我不想使用评论部分。

区域应根据我在输入字符串中给出的IST进行设置:

1
String time ="2018-04-06 16:13:00 IST";

当前机器区域为:America/New_York。 我应该如何根据z获得IST的区域更改?

1
2
3
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
String time ="2018-04-06 18:40:00 IST";
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));

上面运行正常,但我不想明确设置区域。 应根据IST选择我输入的时间字符串。


"I don't want to set zone explicitly"

很抱歉让您失望,但SimpleDateFormat无法做到这一点。像IST这样的时区缩写是模棱两可的 - 正如评论中已经说过的那样,IST在许多地方使用(AFAIK,印度,爱尔兰和以色列)。

在特定情况下,有些缩写可能有时会起作用,但通常是以任意和无证的方式,你不能真正依赖它。引用javadoc:

For compatibility with JDK 1.1.x, some other three-letter time zone IDs (such as"PST","CTT","AST") are also supported. However, their use is deprecated because the same abbreviation is often used for multiple time zones (for example,"CST" could be U.S."Central Standard Time" and"China Standard Time"), and the Java platform can then only recognize one of them.

由于时区缩写的模糊和非标准特征,用SimpleDateFormat解决它的唯一方法是在其上设置特定时区。

"It should be set to based on Z"

我不太确定这意味着什么,但无论如何......

Z是UTC指示符。但是如果输入包含时区短名称,例如IST,那么,这意味着它不是UTC,因此您无法解析它,就像它是UTC一样。

如果要使用Z输出日期,则需要将另一个格式化程序设置为UTC:

1
2
3
4
5
6
7
8
9
10
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
String time ="2018-04-06 18:40:00 IST";
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
// parse the input
Date date = dateFormat.parse(time);

// output format, use UTC
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssX");
outputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(outputFormat.format(date)); // 2018-04-06 13:10:00Z

也许如果您准确指定了您正在获得的输出(使用实际值,输出的一些示例)以及预期输出,我们可以为您提供更多帮助。


1
2
3
4
5
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss z", Locale.ENGLISH);
    String time ="2018-04-06 16:13:00 IST";
    ZonedDateTime dateTime = ZonedDateTime.parse(time, formatter);
    System.out.println(dateTime.getZone());

在我的Java 8上打印出来

Asia/Jerusalem

显然,IST被解释为以色列标准时间。在其他具有其他设置的计算机上,您将获得例如欧洲/都柏林的爱尔兰夏令时或亚洲/加尔各答的印度标准时间。在任何情况下,时区都来自与格式模式字符串中的模式字母(小写)Z匹配的缩写,我想这就是你的意思(?)

如果你想在太频繁的歧义情况下控制时区的选择,你可以用这种方式构建你的格式化程序(从这个答案中窃取的想法):

1
2
3
4
5
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd HH:mm:ss")
            .appendZoneText(TextStyle.SHORT,
                    Collections.singleton(ZoneId.of("Asia/Kolkata")))
            .toFormatter(Locale.ENGLISH);

现在输出是

Asia/Kolkata

我在长期过时且臭名昭着的SimpleDateFormat课程中使用并推荐java.time

链接:Oracle教程:日期时间,解释如何使用java.time