如何格式化给定的时间字符串并转换为日期/时间对象



我正在从休息服务中获取字符串形式的时间对象。我需要提取时间,然后做一些时间操作。给定的时间字符串是"2015-06-16T14:58:48Z"。我尝试了下面的代码,将字符串转换为时间,但是,得到不正确的值。

    String time = "2015-06-16T14:58:48Z";
    SimpleDateFormat formatter = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ss'Z'", Locale.US);
    String dateInString = "2015-06-16T14:58:48Z";
    Date date = formatter.parse(dateInString);
    System.out.println("Original String : " + time);
    System.out.println("After converting to time : " + formatter.format(date));

我得到的输出如下:原字符串 : 2015-06-16T14:58:48Z换算后时间:2015-12-362T02:58:48Z

转换后的日期不知何故获得了错误的值。请建议错误在哪里。谢谢。

格式字符串有几个错误:

  • Y是指周年,而不是y
  • D表示一年中的某一天。您应该使用 d ,这意味着月份中的某一天。
  • h表示一天中的 12 小时表示法时间。既然你有14,你应该使用 H ,它处理 24 小时表示法。

总结一下:

SimpleDateFormat formatter = 
    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.US);

将 SimpleDateFormat 更改为 this..

SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ssX", Locale.US);

java.time

问题的根本原因是使用了错误的符号

  • Y(指定基于周的年份)而不是y(指定纪元年份
  • D(指定一年中的某天)而不是d(指定月份中的某天)。
  • h(指定时钟小时上午下午)而不是H(指定小时)。

查看文档页面以了解有关这些符号的更多信息。

另请注意,旧的日期时间 API(java.util日期时间类型及其格式 API,SimpleDateFormat )已过时且容易出错。建议完全停止使用它并切换到 java.time ,现代日期时间 API*

使用现代 API 的解决方案:

现代日期时间 API 基于 ISO 8601,只要

日期时间字符串符合 ISO 8601 标准,就不需要显式使用 DateTimeFormatter 对象。您的日期时间字符串符合 ISO 8601 标准(或 OffsetDateTime#parse 使用的默认格式)。

import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
    public static void main(String[] args) {
        String strDateTime = "2015-06-16T14:58:48Z";
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
        System.out.println(odt);
        // ########################Extract time information########################
        LocalTime time = odt.toLocalTime();
        // You can also get it as time.getHour()
        // Extract other units in a similar way
        int hour = odt.getHour();
        // Also using time.format(DateTimeFormatter.ofPattern("a", Locale.ENGLISH));
        String amPm = odt.format(DateTimeFormatter.ofPattern("h a", Locale.ENGLISH));
        System.out.println(time);
        System.out.println(hour);
        System.out.println(amPm);
    }
}

输出:

2015-06-16T14:58:48Z
14:58:48
14
2 PM

注意:

  1. 输出中的Z是零时区偏移量的时区指示符。它代表祖鲁语,并指定Etc/UTC时区(时区偏移量为 +00:00 小时)。
  2. 出于任何原因,如果您需要将此OffsetDateTime对象转换为java.util.Date对象,您可以按如下方式执行此操作:
    Date date = Date.from(odt.toInstant());

要了解有关现代日期时间 API* 的更多信息,请参阅跟踪:日期时间

<小时 />

出于任何原因,如果你必须坚持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到Java 6和7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API 和如何在 Android Project 中使用 ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新