Java中new Date().getTime()指定时区的时间戳问题小结

 更新时间:2023年07月18日 09:53:53   作者:自知自省  
本文主要介绍了Java中new Date().getTime()时间戳问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. getTime()返回值

Java和JavaScript都支持时间类型Date,他们的getTime()方法返回的是毫秒数。默认返回的是13位数字,单位是毫秒。

2. 注意事项

 /**
     * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
     * represented by this <tt>Date</tt> object.
     *
     * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
     *          represented by this date.
     */
    public long getTime() {
        return getTimeImpl();
    }

容易造成误解的地方:

如果程序运行在东八区,它返回北京时间1970年01月01日08时00分00秒起至现在东八区时间的总毫秒数。如果运行在UTC时区则返回1970年01月01日00时00分00秒起至当前UTC时间的总毫秒数。看起来似乎getTime()方法获取的时间戳与程序所运行的时区有关。

Perdió的解释非常好,摘抄如下:

其实不是的,getTime()本身是没有问题,取到的timestamp就是从1970-01-01 00:00:00(UTC)起到当前的毫秒数。与程序真实运行的容器(服务器)所在的时区无关。东八区"北京时间1970年01月01日08时00分00秒"不就是UTC的1970年01月01日00时00分00秒吗。

3.Java获取指定时区的时间戳

public static long getTimeZoneTimeStr(String dateStr,String timeZone) {
        long result = 0L;
        int year;
        int month;
        int day;
        int hour;
        int minute;
        int second;
        Calendar calendarTime = Calendar.getInstance();
        if(timeZone != null){
            TimeZone tz = TimeZone.getTimeZone(timeZone);
            calendarTime.setTimeZone(tz);
        }
        if (null != dateStr && 14 == dateStr.length()) {
            year = Integer.parseInt(dateStr.substring(0, 4));
            month = Integer.parseInt(dateStr.substring(4, 6));
            day = Integer.parseInt(dateStr.substring(6, 8));
            hour = Integer.parseInt(dateStr.substring(8, 10));
            minute = Integer.parseInt(dateStr.substring(10, 12));
            second = Integer.parseInt(dateStr.substring(12, 14));
            calendarTime.set(1, year);
            calendarTime.set(2, month - 1);
            calendarTime.set(5, day);
            calendarTime.set(11, hour);
            calendarTime.set(12, minute);
            calendarTime.set(13, second);
            result = calendarTime.getTime().getTime();
        }else if (null != dateStr && 19 == dateStr.length()) {
            year = Integer.parseInt(dateStr.substring(0, 4));
            month = Integer.parseInt(dateStr.substring(5, 7));
            day = Integer.parseInt(dateStr.substring(8, 10));
            hour = Integer.parseInt(dateStr.substring(11, 13));
            minute = Integer.parseInt(dateStr.substring(14, 16));
            second = Integer.parseInt(dateStr.substring(17, 19));
            calendarTime.set(1, year);
            calendarTime.set(2, month - 1);
            calendarTime.set(5, day);
            calendarTime.set(11, hour);
            calendarTime.set(12, minute);
            calendarTime.set(13, second);
            result = calendarTime.getTime().getTime();
        }
        return result;
    }

调用示例:

public static void main(String[] args) {
        System.out.println("-------------------- 2019-09-24 00:00:00 -----------------------");
        System.out.println("local: "+getTimeZoneTimeStr("2019-09-24 00:00:00",null));
        System.out.println("Asia/Shanghai: "+getTimeZoneTimeStr("2019-09-24 00:00:00","Asia/Shanghai"));
        System.out.println("GMT+0800: "+getTimeZoneTimeStr("2019-09-24 00:00:00","GMT+0800"));
        System.out.println("GMT: "+getTimeZoneTimeStr("2019-09-24 00:00:00","GMT"));
        System.out.println("UTC: "+getTimeZoneTimeStr("2019-09-24 00:00:00","UTC"));
        System.out.println("-------------------- 2019-09-23 16:00:00 -----------------------");
        System.out.println("local: "+getTimeZoneTimeStr("2019-09-23 16:00:00",null));
        System.out.println("Asia/Shanghai: "+getTimeZoneTimeStr("2019-09-23 16:00:00","Asia/Shanghai"));
        System.out.println("GMT+0800: "+getTimeZoneTimeStr("2019-09-23 16:00:00","GMT+0800"));
        System.out.println("GMT: "+getTimeZoneTimeStr("2019-09-23 16:00:00","GMT"));
        System.out.println("UTC: "+getTimeZoneTimeStr("2019-09-23 16:00:00","UTC"));
    }

程序运行结果:

-------------------- 2019-09-24 00:00:00 -----------------------
local: 1569254400072
Asia/Shanghai: 1569254400115
GMT+0800: 1569254400115
GMT: 1569283200115
UTC: 1569283200115
-------------------- 2019-09-23 16:00:00 -----------------------
local: 1569225600116
Asia/Shanghai: 1569225600116
GMT+0800: 1569225600116
GMT: 1569254400116
UTC: 1569254400116

总结

运行结果可以看出,在Java中Date.getTime()获取到的时间戳其实是东8区的时间“2019-09-24 00:00:00”(即返回的是北京时间1970年01月1日0点0分0秒以来的毫秒数,对应UTC时间1970年01月1日8点0分0秒以来的毫秒数,其数值大小等于0时区的“2019-09-23 16:00:00”所对应的时间戳)所对应得时间戳。

到此这篇关于Java中new Date().getTime()时间戳问题小结的文章就介绍到这了,更多相关Java getTime()时间戳内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Optional优雅处理空值与链式转换的实战指南

    Java Optional优雅处理空值与链式转换的实战指南

    Optional 是 Java 8 引入的一个容器类,这篇文章主要介绍了Java8中Optional类的使用场景和方法,包括创建Optional、处理null、链式调用以及与Stream的配合等,希望对大家有所帮助
    2026-06-06
  • Liquibase 在 Spring Boot 中的使用详细介绍

    Liquibase 在 Spring Boot 中的使用详细介绍

    Liquibase 提供了灵活的变更集机制,支持创建表、修改列、填充数据、回滚变更等多种操作,本文将通过多个丰富的示例,详细讲解如何在 Spring Boot项目中使用 Liquibase,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • springboot 使用websocket技术主动给前端发送消息的实现

    springboot 使用websocket技术主动给前端发送消息的实现

    这篇文章主要介绍了springboot 使用websocket技术主动给前端发送消息的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解析如何开发FineReport的自定义控件

    解析如何开发FineReport的自定义控件

    FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论。需要的朋友一起来看下吧
    2016-12-12
  • Java Executor 框架的实例详解

    Java Executor 框架的实例详解

    这篇文章主要介绍了Java Executor 框架的实例详解的相关资料,这里提供实例来帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-09-09
  • 基于Java编写一个通用返回工具类Result

    基于Java编写一个通用返回工具类Result

    Java项目搭建时,常常需要去封装一个通用型的Result工具类,下面小编就和大家分享一个已经封装好的常用的返回类,希望对大家有所帮助
    2023-07-07
  • Java GUI事件处理及添加对话框实现方式

    Java GUI事件处理及添加对话框实现方式

    文章介绍了Java中事件处理的基本概念和实现方法,包括事件源、事件对象、监听器以及不同类型的事件处理,如按钮点击、鼠标、键盘和窗口事件,还提供了使用JOptionPane进行对话框操作的示例
    2026-02-02
  • springboot 通过代码自动生成pid的方法

    springboot 通过代码自动生成pid的方法

    这篇文章主要介绍了springboot 通过代码自动生成pid的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Spring JPA联表查询之注解属性详解

    Spring JPA联表查询之注解属性详解

    这篇文章主要为大家介绍了Spring JPA联表查询之注解属性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java多线程之多线程异常捕捉

    Java多线程之多线程异常捕捉

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,通过此篇文章给大家分享Java多线程之多线程异常捕捉,需要的朋友可以参考下
    2015-08-08

最新评论