将日期转换为UTC格式的Java代码

21
我是一名有用的助手,可以为您翻译文本。

我有一个字符串,如下所示:2013-10-22T01:37:56。我需要将此字符串更改为UTC日期格式,如下所示:MM/dd/yyyy KK:mm:ss a。我尝试了一些代码,但它没有返回UTC日期时间。

我的代码是

        String[] time = itsAlarmDttm.split("T");
        String aFormatDate = time[0]+ " "+time[1];
        String aRevisedDate = null;
        try {
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            final Date dateObj = sdf.parse(aFormatDate);
            aRevisedDate = new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a").format(dateObj);
            System.out.println(aRevisedDate);
        } catch (ParseException e) {
            itsLogger.error("Error occured in Parsing the Data Time Object:  " +e.getMessage());
        } catch (Exception e) {
            itsLogger.error("Error occured in Data Time Objecct:  " +e.getMessage());
        }

我得到的输出格式为MM/dd/yyyy KK:mm:ss a,但不是UTC时间格式。如何解决这个问题?

它返回什么? - Buddha
1
你可以尝试打印 aRevisedDate 而不是 dateObj。 - Julien
5
UTC 不是特定的日期格式,而是类似于时区的东西。 - Henry
2
你想返回UTC时区的时间吗? - Buddha
5个回答

34

试一下这个... 对我有用并且打印出了2013年10月22日 01:37:56 AM 当然,这是你的代码,只需要进行少量修改。

final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));   // This line converts the given date into UTC time zone
final java.util.Date dateObj = sdf.parse("2013-10-22T01:37:56");

aRevisedDate = new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a").format(dateObj);
System.out.println(aRevisedDate);

1
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); -- 这正是我要找的 - Steven Solomon
2
这个例子很混乱。"sdf.setTimeZone(...)" 在 "sdf.parse(...)" 之后。而 "format(dateObj)" 使用了一个新的 SimpleDateFormat。因此,"setTimeZone" 对这里的任何内容都没有影响。不过,它是正确的提示。 - jox

13
尝试使用Zz时区标志对日期进行格式化:
new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a Z").format(dateObj);

10
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
// or SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy KK:mm:ss a Z" );
sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
System.out.println( sdf.format( new Date() ) );

8

时区?

您的问题中没有提到时区。输入字符串隐含了哪个时区?您希望输出什么时区?而UTC是一个时区(或者取决于您的想法,它也可以是缺少时区的时间)而不是一个字符串格式

ISO 8601

您的输入字符串采用ISO 8601格式,只是缺少与UTC的偏移量

Joda-Time

这里是一些示例代码,使用 Joda-Time 2.3 来展示如何处理时区。Joda-Time 内置了默认的 格式化程序,用于解析和生成日期时间值的字符串表示。

String input = "2013-10-22T01:37:56";
DateTime dateTimeUtc = new DateTime( input, DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" );
String output = dateTimeMontréal.toString();

关于生成其他格式的字符串表示形式,请在StackOverflow上搜索“Joda格式”。


4

Java时间

一位现代化的回答已经来临。现代解决方案使用java.time,这是现代的Java日期和时间API。在问题中和其他答案中使用的SimpleDateFormatDate类设计不良,过时已久,尤其是前者极为麻烦。同样,TimeZone也设计得很差。我建议你避免使用它们。

    ZoneId utc = ZoneId.of("Etc/UTC");
    DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern(
            "MM/dd/yyyy hh:mm:ss a zzz", Locale.ENGLISH);

    String itsAlarmDttm = "2013-10-22T01:37:56";
    ZonedDateTime utcDateTime = LocalDateTime.parse(itsAlarmDttm)
            .atZone(ZoneId.systemDefault())
            .withZoneSameInstant(utc);
    String formatterUtcDateTime = utcDateTime.format(targetFormatter);
    System.out.println(formatterUtcDateTime);

当在我的时区Europe/Copenhagen运行时,输出结果为:

10/21/2013 11:37:56 PM UTC

我假设你得到的字符串是在JVM的默认时区中,这是一个脆弱的假设,因为该默认设置可以随时从程序的另一部分或在同一JVM中运行的另一个程序更改。如果可以的话,请明确指定时区,例如ZoneId.of("Europe/Podgorica")ZoneId.of("Asia/Kolkata")
我利用了你的字符串采用ISO 8601格式的事实,这是现代类默认解析的格式,即不使用任何显式格式化程序。
我使用ZonedDateTime作为结果日期时间,因为它允许我们在格式化字符串中使用UTC来消除任何疑虑。对于其他目的,通常需要使用OffsetDateTimeInstant

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接