我正在尝试将本地时间转换为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更改,以显示时差。
答案 0 :(得分:1)
使用现代的 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 类,而不要使用那些可怕的旧类,例如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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。