【问题标题】:Read date without timezone information读取没有时区信息的日期
【发布时间】:2014-02-23 03:10:04
【问题描述】:

我收到没有时区限定符的日期时间字符串,格式为:

2014-01-30 07:48:25

我知道这些字符串是由佛罗里达州的服务器生成的。有没有办法使用 java.util 或 joda 日期库来指定日期来自佛罗里达州,然后使用适当的 UTC 偏移量解析它,具体取决于它在日历中的夏令时位置?

【问题讨论】:

  • 解析时,只需确保解析器的时区设置为佛罗里达州的时区。

标签: java date datetime jodatime


【解决方案1】:

假设您指的是美国东部标准时间之后的佛罗里达州,您可以将时区设置为SimpleDateFormat,并将您的时区设置为美国东部标准时间。

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date date = format.parse("2014-01-30 07:48:25");

您的解析日期现在可以被系统的默认TimeZone 使用(或者像我们一开始那样根据您的喜好设置)。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.out.println(date);

我得到的你的日期偏移到 UTC 的输出:

Thu Jan 30 12:48:25 UTC 2014

【讨论】:

    【解决方案2】:

    您可以为SimpleDateFormat 的实例提供“源时区”,然后将要解析的日期字符串转换为您的本地/默认时区。

    TimeZone timeZone = TimeZone.getTimeZone("America/New_York")
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    sdf.setTimeZone(getTimeZone(source));
    

    提供时区名称时要小心。 TimeZone 如果你传入一个它不理解为时区的字符串,它将默默地故障转移到 GMT。

    【讨论】:

      【解决方案3】:

      只是为了完成以前的答案。与Joda-Time 相同的功能:

      DateTime dateTime = DateTime.parse("2014-01-30 07:48:25", DateTimeFormat
         .forPattern("yyyy-MM-dd HH:mm:ss")
         .withZone(DateTimeZone.forID("America/New_York")));
      System.out.println(dateTime);
      System.out.println(dateTime.withZone(DateTimeZone.UTC));
      System.out.println(dateTime.withZone(DateTimeZone.forID("Europe/Madrid")));
      
      ---
      
      2014-01-30T07:48:25.000-05:00
      2014-01-30T12:48:25.000Z
      2014-01-30T13:48:25.000+01:00
      

      【讨论】:

      • 不错的答案,但如果你把第一行分成两部分会更清楚。在第一行实例化一个“格式化程序”变量(DateTimeFormatter),然后在第二行传递它。
      • @BasilBourque 是的,也许可读性更好。我想我有点沉迷于流畅的 API ;-)。
      猜你喜欢
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多