Java获取当前的UTC时间

这篇具有很好参考价值的文章主要介绍了Java获取当前的UTC时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java获取当前的UTC时间

java中如何获取utc时间,并转为Date对象,这是一个常见的问题。可能会找到如下代码的回答:

public static void main(String[] args) {
	Date current = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime();
	System.out.println(current);
}

但是运行过后发现不能获取带UTC时间

Tue Mar 20 13:05:22 CST 2023

那么为什么不能获取,如何正确获取utc时间呢?

Calendar与TimeZone

分析一下上述代码为什么不能获取正确的UTC时间
看一下Calendar.getTime()方法

    /**
     * Returns a <code>Date</code> object representing this
     * <code>Calendar</code>'s time value (millisecond offset from the <a
     * href="#Epoch">Epoch</a>").
     *
     * @return a <code>Date</code> representing the time value.
     * @see #setTime(Date)
     * @see #getTimeInMillis()
     */
    public final Date getTime() {
        return new Date(getTimeInMillis());
    }

本质上是通过getTimeInMillis()获取了UTC的毫秒时间,然后new一个Date对象。
Date对象保存的是毫秒数,本身不带时区信息。但是如果想要把Date展现出来(比如System.out.println(new Date())实际上是生成了当前时间并调用了Date.toString()方法)时就会存在时区的概念转换,因为不是所有人都只想要UTC时间。所以当调用Date.toString()Date.parse()等方法时,就会存在时区信息。

    public String toString() {
        // "EEE MMM dd HH:mm:ss zzz yyyy";
        BaseCalendar.Date date = normalize();  // 调用此方法获取带时区信息的BaseCalendar
        StringBuilder sb = new StringBuilder(28);
        int index = date.getDayOfWeek();
        if (index == BaseCalendar.SUNDAY) {
            index = 8;
        }
        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
        TimeZone zi = date.getZone();
        if (zi != null) {
            sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
        } else {
            sb.append("GMT");
        }
        sb.append(' ').append(date.getYear());  // yyyy
        return sb.toString();
    }

    private final BaseCalendar.Date normalize() {
        if (cdate == null) {
            BaseCalendar cal = getCalendarSystem(fastTime);
            cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
                                                            TimeZone.getDefaultRef()); // 此处取的默认时区
            return cdate;
        }
        // ...
    }

可以发现toString()方法使用了normalize()初始化了一个带时区信息的BaseCalendar,而会默认使用TimeZone.getDefaultRef(),即JVM的系统默认时区。所以这里可以解释System.out.println(new Date())时打印的是带时区的时间,而非UTC时间。

结论:因此想要获取UTC时间可以修改系统默认时区或转换时区

修改系统默认时区
    public static void main(String[] args) {
        Date current = Calendar.getInstance().getTime();
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        System.out.println(current);
    }

但是此修改可能是全局性的,建议在代码启动之初设定全部使用同一时区时间,后面就不再频繁更改,避免产生时间错乱问题。

SimpleDateFormat 转换时区

    public static void main(String[] args) {
        Date current = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime();
        System.out.println(current);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        format.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(format.format(current));
    };

输出

Wed Mar 22 00:29:11 CST 2023
2023-03-21 16:29:11

Instant

jdk8提供了Instant对象,Instant获取的是格林威治标准时间(UTC时间)。因为Instant是表示时间戳的对象,它不依赖于时区信息。但是在显示Instant对象时,需要将其转换为特定时区的本地时间。

    public static void main(String[] args) {
        Date current=  Date.from(Instant.now());
        System.out.println(current);
        
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  // 东京
        format.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(format.format(current));
    }

输出文章来源地址https://www.toymoban.com/news/detail-446294.html

Wed Mar 22 00:29:11 CST 2023
2023-03-21 16:29:11

到了这里,关于Java获取当前的UTC时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 获取当前日期和时间

     System.currentTimeMillis() 获取标准时间可以通过 System.currentTimeMillis() 方法获取,此方法不受时区影响,得到的结果是时间戳格式的。例如: 我们可以将时间戳转化成我们看得懂的形式 则该时间戳对应的时间为 值得注意的是,此方法会根据我们系统时间返回当前值,因为世界各

    2024年02月05日
    浏览(49)
  • 微信小程序如何获取当前日期时间

    Hello大家好!我是咕噜铁蛋,获取当前日期时间是小程序中经常会用到的一个功能。因此,在本文中,我通过科技手段给大家收集整理了下,今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法,并分享一些实用技巧和注意事项。 一、获取当前日期时间的方法

    2024年01月23日
    浏览(60)
  • 【知识分享】Java获取当前周的开始时间结束时间

    在某种场景下我们可能需要获取当前周的开始时间、结束时间,当前月的开始时间、结束时间等,给大家分享一个工具类帮助大家快速去获取你需要的时间,便于节省时间。

    2024年02月03日
    浏览(68)
  • java获取Timestamp类型的当前系统时间

    java获取取得Timestamp类型的当前系统时间 java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new Timestamp(System.currentTimeMillis()); 方法2: Date date = new Date(); Timestamp nousedate = new Timestamp(date.getTime()); ----------------------------- 下为相关内容整合 Java中Date及

    2024年02月11日
    浏览(66)
  • Java(106):Java获取当天或者明天等零点时间(00:00:00)的方法,获取当前时间后60秒或30天的时间

    Java获取当天或者明天等零点时间(00:00:00)的方法 执行结果: 其他: 获取当前时间后60秒的时间 获取当前时间的后 30天, 或者N天 Calendar now = Calendar.getInstance(); now.add(Calendar.Date, 30); Date date = now.getTime();

    2024年02月15日
    浏览(48)
  • 如何在JavaScript中获取当前时间yyyymmddhhmmss? (六种实现方式)

    在编写JavaScript代码时,我们经常需要获取当前日期和时间。在本文中,我们将介绍几种获取当前时间并将其格式化为 yyyymmddhhmmss 的字符串的方法。 在JavaScript中,我们可以使用 Date 对象来获取当前日期和时间。下面是一个示例代码: 在上面的代码中,我们使用 getFullYear 、

    2024年02月11日
    浏览(43)
  • java根据当前时间或指定时间获取前后几天或前后几个月或前后几年的时间

    获取前后几天 获取前后几个月 获取前后几年 获取前后几天 获取前后几个月 获取年后几年

    2024年02月15日
    浏览(44)
  • 如何在Java中获取当前年份

    在Java语言中获取当前年份有几种方法:使用java.util包下的Calendar类,使用java.time包下的LocalDate类或者使用java.text包下的SimpleDateFormat类。 java.util类库中的Calendar类包含关于日期时间的信息,我们可以通过其提供的方法获取到当前的年份。 在上述代码中,首先通过Calendar类的ge

    2024年02月06日
    浏览(47)
  • SOAP学习之一:Visual C++创建简单的客户端--使用soap toolkit 3.0获取UTC服务器时间

    初始接触 XML及SOAP第一天,摸不着头绪,看了很多文章,总结一下几点心得,附一个小例子使用VC++控制台程序获取UTC服务器时间。 看到的资料VC++都是使用soap toolkit来使用SOAP,soap toolkit目前看最高版本应该是3.0,但是微软已经不再对soap toolkit提供技术支持及更新,在微软官网

    2024年02月09日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包