当前位置: 首页 > 面试题库 >

解析和检索与日期时间的时区偏移量

弘志勇
2023-03-14
问题内容

日期格式:“ 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.timeJoda 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使用的无效区域。 例如,在执行此操作时: