日期格式:“ yyyy-MM-dd’T’HH:mm:ss.SSSZ ”
输入日期:“ 2017-09-18T03:08:20.888 + 0200 ”
问题:我需要从输入的字符串中检索时区偏移量,并在该时区中打印已解析的日期。换句话说,我需要输出与输入相同。
SimpleDateFormat
成功解析输入日期并返回java.util.Date
对象。众所周知,Date没有时区字段。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
SimpleDateFormat
扩展DateFormat
并因此在内部使用Calendar
。解析日历更新的日期时,可以 在 解析 后
从中获取时区:
~~~~
//use the timezone of the internally stored calendar
outputSdf.setTimeZone( inputSdf.getTimezone() );
这也说明了为什么DateFormat
不是线程安全的。
编辑:
似乎内部日历的时区 未更新, 但ZONE_OFFSET字段已 更新 。因此,您可以执行以下操作:
int zoneOffset = inputSdf.getCalendar().get( Calendar.ZONE_OFFSET );
//length check etc. left for you
String matchingZoneId = TimeZone.getAvailableIDs( zoneOffset )[0];
outputSdf.setTimeZone( TimeZone.getTimeZone( matchingZoneId ) );
请注意,您不能只设置输出格式的时区偏移量,因为这不会更新格式化时使用的时区参考。
如您所见,以这种方式进行操作看起来有些“棘手”,因此您应该认真考虑是否 确实
需要时区。在大多数情况下,无论如何,您都将以不同的方式定义输出时区,例如通过获取用户的位置,输入等。
JSON-API-response包含以下属性: 我使用Moshi和ThreeTenBp解析时间戳,并准备了以下自定义适配器: 如您所见,区域偏移量在这里是硬编码的。 ... 使用Moshi和Kotlin的高级JSON解析技术 相关项目的进行中的分支
问题内容: 我有一个带有时间戳属性的模型: 时间戳的格式如下: 无法解析此: com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“ 2017-09-17 13:45:42.710576 + 02” 反序列化类型的值:文本“ 2017-09-17 13:45:42.710576 + 02”可能不能在索引10处解析 我怎样才
我使用HTML5输入日期和输入时间进行ionic开发。默认情况下,它绑定为ISO日期字符串并更改为UTC日期时间。在我看来,这似乎是错误的,因为当用户选择日期2016-06-06时,它可能已成为2016-06-07或2016-06-05,具体取决于时区偏移。输入类型=时间的类似情况。 我的意图是使ISO字符串中的日期保留为用户选择的日期,而不是用时区差来抵消它。 类似于输入datetime本地,但
提前感谢!
问题内容: 我需要将以下格式的String解析为UTC中的LocalDate(或其他)。问题是以下代码: 输出忽略偏移量。所需的输出是 提前致谢! 问题答案: 最简单的答案是用来表示数据,但是您需要默认时间: 在处理时区时很有用,但是在仅处理偏移量时,它会更简单。 通常,应用程序代码不应包含type的变量。如果您看到了,通常会有更好的方法。
我需要将查询中的日期值转换为带有时区的时间戳,但目前我得到的时区区域(“欧洲/巴黎”)是EF使用的无效区域。 例如,在执行此操作时: