如何在java中获取当前日期的时区偏移量

时间:2017-07-10 07:38:04

标签: java

正在寻找正确的日期格式: - “2017-07-06T18:03:39.195 + 0530”

如何在java中获取当前日期的+0530?

  
    

当我使用SimpleDateFormat时它给出+0000,而它应该给+0530。

  

=============================================== ==
我尝试过使用以下内容: -

SimpleDateFormat format = new SimpleDateFormat("enter code hereyyy-MM-dd HH:mm:ss.SSS Z");
String dateString = format.format(new Date());
System.out.println("value of dateString is :"+dateString); 

上面的代码将输出: - dateString的值是:2017-07-10 06:51:27.250 +0000

虽然它应输出:+0530

请告诉我如何获得上述日期或当前日期的+0530偏移?

4 个答案:

答案 0 :(得分:1)

经过大量的搜索,我发现时区问题可以通过joda time api解决,你可以使用下面的代码来实现我想要的问题 -

DateTime dateTime = DateTime.now(); 的System.out.println(则DateTime.ToString( “YYYY-MM-dd'T'HH:MM:ss.SSSZ”));

输出(当前日期和适当的时区) - 2017-07-10T15:01:48.319 + 0530

答案 1 :(得分:1)

您可以将Java 8 DateTime API用于其他解决方案

ZoneId zone = ZoneId.systemDefault(); //It will give current System's timezone (IST for you)
Date date = new Date(); // Any date

DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z", Locale.ENGLISH);

ZonedDateTime zonedTime = ZonedDateTime.ofInstant(date.toInstant(), zone);

System.out.println(zonedTime.format(formatter));

以上代码将为您提供具有正确区域偏移的日期

答案 2 :(得分:0)

设置所需的时区。你的代码会像:

SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss.SSS Z");
format.setTimeZone(TimeZone.getTimeZone("IST"));
String dateString = format.format(new Date());
System.out.println("value of dateString is :"+dateString);

答案 3 :(得分:0)

tl; dr

ZonedDateTime.now( ZoneId.of( "Asia/Kolkata" ) ).toOffsetDateTime().toString()

OffsetDateTime

要直接解决问题,请使用现代的OffsetDateTime c激光眼镜。

OffsetDateTime.now().toString()

请参阅此code run live at IdeOne.com

  

odt.toString():2019-08-22T17:44:00.219684Z

这将使用标准ISO 8601格式生成一个字符串,该字符串表示JVM当前默认时区使用的偏移量中的当前时刻。区别之一:该方法将在偏移的小时和分钟之间包含可选的COLON :字符。我建议不要忽略该字符,因为我已经看到多个库在此类输入上中断,并期望COLON在那里。

捕获当前时刻时,结果可能会解析为微秒。如果您希望使用毫秒,则将其截断,将其截去。

OffsetDateTime.now().truncatedTo( ChronoUnit.MILLIS ) 
  

odtTruncated.toString():2019-08-22T17:44:00.219Z

在IdeOne.com上运行的代码在JVM中,对于UTC本身,偏移量设置为零。因此,我们在末尾看到了Z,它是+00:00的常见标准替代品,发音为“ Zulu”。

您可能要明确指定偏移量。

Instant instant = Instant.now() ;  // Current moment in UTC.
ZoneOffset offset = ZoneId.of( "Asia/Kolkata" ).getRules().getOffset( instant ) ;  // We must pass a moment. India is currently at five and a half hours ahead of UTC. But it has not always been so in the past, and may not always be so in the future.
OffsetDateTime odt = instant.atOffset( offset ) ;
  

odt.toString():2019-08-22T23:00:06.925139 + 05:30

我认为更简洁的语法是使用ZonedDateTime

String output = ZonedDateTime.now( ZoneId.of( "Asia/Kolkata" ) ).toOffsetDateTime().toString() ;
  

2019-08-22T23:03:19.072681 + 05:30

ZonedDateTime

更有可能您应该在时区中获取当前时刻,而不是仅仅偏移。如果是这样,请参阅Answer by RaT

请注意偏移量和区域之间的区别:

  • 从UTC偏移仅是UTC之前或UTC后面数小时-数分钟-秒。
  • 时区远不止于此。时区是特定区域的人们过去,现在和将来对偏移量的更改的历史记录。区域具有Continent/Region格式的名称,例如America/MontrealAfrica/Tunis

转换

通常,您应该避免使用可怕的日期时间类,例如java.util.DateSimpleDateFormat,它们现在都是旧的。始终使用InstantOffsetDateTimeZonedDateTime。切勿使用DateCalendar

但是,如果必须与 java.time 类尚未更新的旧代码进行互操作时必须使用旧类,则可以来回转换。显示在Answer by RaT中。


Table of date-time types in Java (both modern and legacy) and in standard SQL