Java获得UTC时间

我想在UTC时区获得时间。 所以我写了代码:

import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Date; public class RegularSandbox { public static void main(String[] args) { ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC); System.out.println("DATETIME = " + Date.from(utc.toInstant())); } } 

问题是输出显示了我在PST(我当地时区)的时间。 我需要它以UTC格式输出时间,以便将其存储在我的数据库中。

 System.out.println("DATETIME = " + utc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"))); 

尝试转换为旧的java.util.Date时,您执行的操作太多了。 然后你隐式使用它的方法toString()应该是众所周知的观察行为,以便始终在系统时区打印瞬间。

但是,以UTC时区打印非常简单,如果您能够处理ISO-8601表示法,甚至不需要格式化程序:

 ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC); System.out.println("DATETIME = " + utc.toInstant()); // output: DATETIME = 2015-12-30T15:01:18.483Z (Instant is always printed with UTC offset) System.out.println("DATETIME = " + utc); // output: DATETIME = 2015-12-30T15:01:57.611Z (the same because you // have explicitly set the UTC Offset when constructing the ZonedDateTime) 

您可以看到,新Java-8类InstantZonedDateTimetoString()行为更加清晰,并且始终采用ISO格式。 无需令人困惑的转换为Date

关于专业格式化程序,如果您打算偏离ISO-8601格式,则只需要一个 – 可能使用本地化的月份名称或工作日的额外打印等。美式示例:

 System.out.println( "DATETIME = " + utc.format(DateTimeFormatter.ofPattern("MM/dd/uuuu h:mm:ss a xxx"))); // output: DATETIME = 12/30/2015 3:14:50 PM +00:00 

请注意,@ LowLevel的答案使用了错误的模式。 如果省略符号a(AM / PM标记),则不应选择半天小时符号h而是H(24小时格式)。 时区或偏移符号(此处为x)至关重要,否则打印的日期时间将不会自动识别为UTC时区。

 ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC); final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss az"); // you can specify format that you want to get sdf.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println("UTC time: " + sdf.format(utc)); 
  private Calendar getUTCTime(){ Calendar calendar = Calendar.getInstance(); // Assuming your time is in utc + 8 calendar.add(Calendar.HOUR, -8); return calendar; } 

我建议你使用Joda-Time 。

 DateTime dt = new DateTime(DateTimeZone.UTC);