【发布时间】:2018-01-12 16:35:31
【问题描述】:
日期格式:“yyyy-MM-dd'T'HH:mm:ss.SSSZ”
输入日期:“2017-09-18T03:08:20.888+0200”
问题:我需要从输入字符串中检索时区偏移量并在该时区打印解析的日期。换句话说,我需要输出与输入相同。
SimpleDateFormat 成功解析输入日期并返回java.util.Date 对象。 As we know,日期没有时区字段。 SimpleDateFormat 将解析的日期转换为其时区,默认情况下为系统时区。当我打印这个日期时,它是在系统时区打印的。
简单演示
private static void runDemoTask() throws ParseException {
final String dateTimeTimezoneFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
final SimpleDateFormat inputSdf = new SimpleDateFormat(dateTimeTimezoneFormat);
final String inputDate = "2017-09-18T01:08:20.888+0200";
Date parsedDate = inputSdf.parse(inputDate);
final SimpleDateFormat outputSdf = new SimpleDateFormat(dateTimeTimezoneFormat);
//outputSdf.setTimeZone("X_TIMEZONE_WHICH_I_NEED");
String output = outputSdf.format(parsedDate);
System.out.println(output);
}
输出
Mon Sep 18 00:08:20 GMT+01:00 2017
注意,输出日期有系统时区,与输入字符串不同。
注意,我不会使用java.time、Joda Time等库,因为我需要支持现有的代码。
可能的不愉快解决方案
我尝试使用正则表达式来检索符号和偏移量。
private static String parseTimeZone(String input) {
final int singGroup = 1;
final int offsetGroup = 2;
final String timezonePatternStr = "([+-])(\\d{4})$";
final Pattern timezonePattern = Pattern.compile(timezonePatternStr);
Matcher matcher = timezonePattern.matcher(input);
if (matcher.find()) {
String sign = matcher.group(singGroup);
String offset = matcher.group(offsetGroup);
System.out.println(sign + " " + offset);
}
return "";
}
打印出来
+ 0200
【问题讨论】:
-
好吧,您可以通过正则表达式提取时区部分,但您真的需要它吗?毕竟,无论在哪个时区,日期都是同一个时间点,这就是为什么它没有时间点。在向用户显示该时区时,您可以使用他们的(首选)时区,这可能只是另一个时区。
-
吹毛求疵,+0200 不是时区,它是与 UTC 的偏移量。我想这就是你需要的?使用
java.time,现代 Java 日期和时间 API:OffsetDateTime.parse("2017-09-18T03:08:20.888+0200").getOffset()。 -
正则表达式的旁注:
([+]|[-])可以简化为([+-]),因为[...]是一个匹配任何一个 字符的字符类。如果减号不是第一个或最后一个字符,则需要对其进行转义,否则它将被解释为定义一个范围,如a-z。 -
等等。您的“现有代码”在哪个版本上运行?如果您可以使用 Java 8,您的工作会简单得多。
-
Java 8。可能,我会在那个代码位置使用 java.time 库...