Java获得UTC时间

时间:2015-12-27 20:56:03

标签: java datetime java-8

我想以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格式输出时间,以便将其存储在我的数据库中。

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

尝试转换为旧版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类toString()Instant的{​​{1}}的行为更加清晰,并且始终采用ISO格式。无需令人困惑的转换为ZonedDateTime

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

Date

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

答案 2 :(得分:2)

ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);
final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z"); // you can specify format that you want to get
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC time: " + sdf.format(utc));

答案 3 :(得分:-3)

        private Calendar getUTCTime(){
            Calendar calendar = Calendar.getInstance();
            // Assuming your time is in utc + 8
            calendar.add(Calendar.HOUR, -8);
            return calendar;
        }

答案 4 :(得分:-4)

我建议您使用Joda-Time

var words = $('#userinput').val();