使用Java的UTC本地时间

时间:2018-10-28 08:58:03

标签: java android date datetime

我正在尝试将本地时间转换为Java中的UTC时间。我已经编写了代码:

    String datesToConvert = "31-12-2018 23:37:00";
    String dateFormat = "dd-MM-yyyy HH:mm:ss";

    SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat);
    sdf2.setTimeZone(TimeZone.getDefault());
    Date gmt = null;

    SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

    try {
        gmt = sdf2.parse(datesToConvert);
        System.out.println("UTC FORMATTED DATE : " + sdfOutPutToSend.format(gmt));

    } catch (Exception e) {
        e.printStackTrace();
    }

我得到的输出是: UTC格式日期:2018-12-31T18:07:00.000Z

但是我希望它是相同的日期和时间,但是最后以.000Z更改,以显示时差。

1 个答案:

答案 0 :(得分:1)

tl; dr

使用现代的 java.time 类。

LocalDateTime
.parse( 
    "31-12-2018 23:37:00" , 
    DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" )
)
.atOffset(
    ZoneOffset.UTC 
)
.toString()
  

2018-12-31T23:37Z

java.time

使用现代的 java.time 类,而不要使用那些可怕的旧类,例如Date

将输入字符串解析为LocalDateTime,因为它没有任何时区或从UTC偏移的指示,因此代表时刻。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "31-12-2018 23:37:00" , f ) ;

您声称知道此输入字符串的预期时区。如果可以确定,请应用ZoneId来获得ZonedDateTime,以确定实际时刻,即时间轴上的一点。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

您的问题不清楚。但是看来您可能是在说输入内容旨在表示UTC时刻。如果是这样,请应用ZoneOffset.UTC常量以获得一个OffsetDateTime对象。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
  

期望的输出:2018-12-31T23:37:00.808Z

这是不可能的,因为您的输入字符串缺少小数秒.808

您报告为问题的结尾.000Z是正确的,因为零表示没有小数秒。最后的Z表示UTC(与UTC的偏移量为零),是+00:00的缩写,并且发音为Zulu


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

相关问题