【问题标题】:Converting String in ISO8601 T-Z format to Date将 ISO8601 T-Z 格式的字符串转换为日期
【发布时间】:2013-07-15 14:20:09
【问题描述】:

可能的解决方案:Convert Java Date into another Time as Date format

我通过了它,但没有得到我的答案。

我有一个字符串“2013-07-17T03:58:00.000Z”,我想将其转换为与我们在创建新 Date().Date 时获得的相同格式的日期d=新日期();

时间应该在 IST 区 - 亚洲/加尔各答

因此上面字符串的日期应该是

Wed Jul 17 12:05:16 IST 2013 //根据印度标准 GMT+0530 的任何时间

String s="2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
TimeZone tx=TimeZone.getTimeZone("Asia/Kolkata");
formatter.setTimeZone(tx);
d= (Date)formatter.parse(s);

【问题讨论】:

    标签: java date datetime simpledateformat


    【解决方案1】:

    java.time

    我想提供现代答案。并给你一个建议:与其复制Date.toString() 会给你的东西,不如为相关语言环境中的用户使用内置格式:

        String isoString = "2013-07-17T03:58:00.000Z";
        String humanReadable = Instant.parse(isoString)
                .atZone(userTimeZone)
                .format(localizedFormatter);
        System.out.println(humanReadable);
    

    在我的电脑上打印

    17 July 2013 at 09.28.00 IST
    

    我的 sn-p 使用了几个常量

    private static final ZoneId userTimeZone = ZoneId.of("Asia/Kolkata");
    private static final DateTimeFormatter localizedFormatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.LONG)
            .withLocale(Locale.getDefault(Locale.Category.FORMAT));
    

    当我们只传递默认格式语言环境时,withLocale 调用是多余的。如果您的用户需要不同的语言环境,我将其放入其中以便您可以提供一个明确的语言环境。它还具有明确表明结果取决于语言环境的好处,以防阅读您的代码的人没有想到这一点。

    我正在使用现代 Java 日期和时间 API java.time。它比过时的DateTimeZone 和臭名昭著的麻烦DateFormatSimpleDateFormat 要好得多。您的字符串符合 ISO 8601 标准,现代类将其解析为默认格式,即没有任何显式格式化程序。

    与日期给你的格式相同

    当然,如果您需要,您可以使用与老式Date 相同的格式。只需用这个替换上面的格式化程序:

    private static final DateTimeFormatter asUtilDateFormatter 
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
    

    现在我们得到:

    Wed Jul 17 09:28:00 IST 2013
    

    教程链接

    阅读更多关于在the Oracle tutorial 中使用java.time 和/或找到其他资源。

    【讨论】:

      【解决方案2】:

      日期没有任何时区。如果您想知道印度时区中日期的字符串表示形式,则使用另一个 SimpleDateFormat,其时区设置为印度标准,并使用这个新的 SimpleDateFormat 格式化日期。

      编辑:代码示例:

      String s = "2013-07-17T03:58:00.000Z";
      DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
      Date d = formatter.parse(s);
      
      System.out.println("Formatted Date in current time zone = " + formatter.format(d));
      
      TimeZone tx=TimeZone.getTimeZone("Asia/Calcutta");
      formatter.setTimeZone(tx);
      System.out.println("Formatted date in IST = " + formatter.format(d));
      

      输出(当前时区为巴黎 - GMT+2):

      Formatted Date in current time zone = 2013-07-17T05:58:00.000+02
      Formatted date in IST = 2013-07-17T09:28:00.000+05
      

      【讨论】:

      • 嗨..我已经编辑了我的代码..但它说无法解析字符串。
      • SimpleDateFormat 字符串应该是 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 否则会得到 java.lang.IllegalArgumentException: Unknown pattern character 'X'
      • @VijayC 这取决于您的 Java 版本。 Z 表示偏移量为零或“祖鲁时区”,因此您应该更愿意确保这样解析它。
      【解决方案3】:

      使用日历作为时区。

      TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
      Calendar cal = Calendar.getInstance(tz);
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
      sdf.setCalendar(cal);
      cal.setTime(sdf.parse("2013-07-17T03:58:00.000Z"));
      Date date = cal.getTime();
      

      不过,我推荐Joda Time,因为它在这种情况下具有更好的功能。对于 JodaTime,您可以执行以下操作:

      DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
      DateTime dt = dtf.parseDateTime("2013-07-17T03:58:00.000Z");
      Date date = dt.toDate();
      

      【讨论】:

      • 它会返回一个日期对象吗?
      • 已编辑,因此最后一行将其恢复为最新。但请注意,Date 没有时区。
      • 但是 joda Time jar 文件很重。包括它只是为了转换日期一次有意义吗?
      • 这就是为什么我还包括一些使用日历的东西,以防你不想使用 Joda Time?
      • 经过长时间的搜索,我发现这是唯一可行的解​​决方案。谢谢@MarkM
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多