日期为UTC格式Java

时间:2013-11-27 09:20:30

标签: java date datetime

我有一个像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时间格式。 如何解决这个问题?

5 个答案:

答案 0 :(得分:17)

试试这个...为我工作并打印10/22/2013 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 :(得分:10)

尝试使用Zz时区标记格式化日期:

new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a Z").format(dateObj);

答案 2 :(得分:4)

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() ) );

答案 3 :(得分:4)

什么时区?

你的问题中没有提到time zone。输入字符串表示什么时区?您想要什么时区输出?并且,UTC是一个时区(或缺少时区,取决于您的心态)不是字符串格式

ISO 8601

您的输入字符串格式为ISO 8601,但缺少offset from UTC

约达时间

以下是Joda-Time 2.3中的一些示例代码,向您展示如何处理时区。 Joda-Time内置默认formatters,用于解析和生成日期时间值的字符串表示。

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 :(得分:1)

java.time

现在该有人提供现代答案了。现代解决方案使用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);

在我所在的时区,欧洲/哥本哈根运行时,输出为:

  

2013年10月21日下午11:37:56 UTC

我假设您获得的字符串位于JVM的默认时区中,这是一个脆弱的假设,因为可以随时从程序的另一部分或在同一JVM中运行的另一个程序更改默认设置。如果可以,请改为明确指定时区,例如ZoneId.of("Europe/Podgorica")ZoneId.of("Asia/Kolkata")

我正在利用您的字符串为ISO 8601格式这一事实,现代类将其解析为默认格式,即没有任何显式格式化程序。

我将ZonedDateTime用于结果日期时间,因为它允许我们用格式化字符串中的UTC对其进行格式化,以消除所有疑问。为了其他目的,通常会希望使用OffsetDateTimeInstant

链接