时区、时间戳、时间点三者的关系

时区、时间戳、时间点这三个概念与Java的Date类和Calendar类紧密联系。分别说说区别。然后说一下Java的Date类和Calendar

1. 时间戳

时间戳指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。时间戳是没有时区的概念的,在不同的时区下,System.currentTimeMillis() 获得的值是一样的,即使在中国和美国都一样。也可以理解为UTC此刻的时间到格林威治时间的总秒数。测试如下:

public class Main {
    public static void main(String[] args) {
        System.out.println("===========TimeStamp at different TimeZone=============\n");
        System.out.println("Local timeStamp is: " + getTimeZoneTimeNow(TimeZone.getDefault().getID()));
        System.out.println("timeStamp at UTC-05:00 is: " + getTimeZoneTimeNow("UTC-05:00"));
    }

    // 获取某个时区当前的时间戳
    public static long getTimeZoneTimeNow(String timeZoneId) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId));
        return calendar.getTimeInMillis();
    }
}

===========TimeStamp at different TimeZone=============

Local timeStamp is: 1700098745560
timeStamp at UTC-05:00 is: 1700098745579

可以看到不同时区下时间戳是一致的

2. 时区

虽然全世界都规定了统一的时间戳,但是由于太阳的东升西落,每个地方早上和晚上的时间点不一样,如果都采用UTC-00:00时间那么全世界统一是一个问题。人类为了适配太阳的升落引入了时区的概念,按照经度划分将地球分为24个时区,每个时区15度。相邻时区间相差一小时。本初子午线(格林尼治子午线,是位于英国格林尼治天文台的一条经线(亦称子午线)为UTC-00:00)标准时间,向东依次为UTC+01:00, UTC+02:00等时区,向西为UTC-01:00, UTC-02:00等时区。全世界通过UTC来协调各地时间。查看世界所有时区网站
在这里插入图片描述

3. 时间点

既然有了时区和时间戳的概念,那么两者结合起来就可以得到一个时间戳在不同时区下对应的时间点了。因此我们平时说的时间其实北京时间18:00整。翻译过来就是某一个时间戳在UTC+08:00下对应的时间点为18:00。如果单说18:00整而不说时区那就是有歧义的。这个时刻在不同的时区下时间点是不一样的。

4. Date类

Java中的Date类查看源码可以知道表示的是某一个时刻的的时间戳。没有时区的概念。值为自1997-01-01 00:00:00(GMT)至Date对象记录时刻所经过的毫秒数可以通过getTime()方法,获取这个变量值,且这个变量值和时区没有关系全球任意地点同时执行new Date().getTime()获取到的值相同。

    public Date() {
        this(System.currentTimeMillis());
    }

4.1 Date类格式化涉及时区

查看 Date类的toString方法,可以得到其是根据本地时区进行转化的。因此得到的是本地时间。不管是调用Date对象的toString方法, 还是使用SimpleDateFormatformat方法去格式化Date对象,或者使用parse解析字符串成Date对象都会涉及到时区, 也就是说Date对象没有时区概念, 但是格式化Date对象, 或者解析字符串成Date对象时, 是有时区概念的。

public class TestDate {
    public static void main(String[] args) {
        System.out.println(new Date().toString());
    }
}

Thu Nov 16 10:11:51 CST 2023
public class TestDate {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);
        // modify default timezone
        TimeZone.setDefault(TimeZone.getTimeZone("GMT-08:00"));
        System.out.println(date);
    }
}

Thu Nov 16 10:41:19 CST 2023
Wed Nov 15 18:41:19 GMT-08:00 2023
public class TestDate {
    public static void main(String[] args) {
        Date date = new Date();
       
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateFormat.format(date));

        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
        System.out.println(dateFormat.format(date));
        
        //2023-11-16 10:43:51
        //2023-11-16 03:43:51
    }
}

解析字符串成Date对象, 涉及时区将同一个时间字符串按照不同的时区来解析, 得到的Date对象值不一样很好理解: 东八区8点当然和0时区8点不一样。

public class TestDate {
    public static void main(String[] args) throws ParseException {
        String dateStr = "2019-12-10 08:00:00";

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = dateFormat.parse(dateStr);
        System.out.println(date1.getTime());


        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
        Date date2 = dateFormat.parse(dateStr);
        System.out.println(date2.getTime());

 // 输出
//        1575936000000
//        1575961200000

    }
}
  1. Calendar
    Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。

Calendar类只能通过静态方法获取实例

    /**
     * Gets a calendar using the default time zone and locale. The
     * {@code Calendar} returned is based on the current time
     * in the default time zone with the default
     * {@link Locale.Category#FORMAT FORMAT} locale.
     * <p>
     * If the locale contains the time zone with "tz"
     * <a href="Locale.html#def_locale_extension">Unicode extension</a>,
     * that time zone is used instead.
     *
     * @return a Calendar.
     */
    public static Calendar getInstance()
    {
        Locale aLocale = Locale.getDefault(Locale.Category.FORMAT);
        return createCalendar(defaultTimeZone(aLocale), aLocale);
    }

    /**
     * Gets a calendar using the specified time zone and default locale.
     * The {@code Calendar} returned is based on the current time
     * in the given time zone with the default
     * {@link Locale.Category#FORMAT FORMAT} locale.
     *
     * @param zone the time zone to use
     * @return a Calendar.
     */
    public static Calendar getInstance(TimeZone zone)
    {
        return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
    }

    /**
     * Gets a calendar using the default time zone and specified locale.
     * The {@code Calendar} returned is based on the current time
     * in the default time zone with the given locale.
     * <p>
     * If the locale contains the time zone with "tz"
     * <a href="Locale.html#def_locale_extension">Unicode extension</a>,
     * that time zone is used instead.
     *
     * @param aLocale the locale for the week data
     * @return a Calendar.
     */
    public static Calendar getInstance(Locale aLocale)
    {
        return createCalendar(defaultTimeZone(aLocale), aLocale);
    }

    /**
     * Gets a calendar with the specified time zone and locale.
     * The {@code Calendar} returned is based on the current time
     * in the given time zone with the given locale.
     *
     * @param zone the time zone to use
     * @param aLocale the locale for the week data
     * @return a Calendar.
     */
    public static Calendar getInstance(TimeZone zone,
                                       Locale aLocale)
    {
        return createCalendar(zone, aLocale);
    }

Calendar对象可以调用set方法定位到任何一个时间。调用get方法获得时间点的所有信息。简单使用如下:

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();// get default time zone time
        printTimeInfo(calendar);

        // add on year. All Field can be added. amount can be minus
        calendar.add(Calendar.YEAR, 1);
        printTimeInfo(calendar);

        // UTC-08:00
        Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
        printTimeInfo(calendar1);
    }


    public static void printTimeInfo(Calendar calendar) {
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int min = calendar.get(Calendar.MINUTE);
        int sec = calendar.get(Calendar.SECOND);
        String format = "TimeZone: %s, %d-%d-%d, %d:%d:%d";
        System.out.println(String.format(format, calendar.getTimeZone().getID(), year, month + 1, day, hour, min, sec));
    }
}

TimeZone: Asia/Shanghai, 2023-11-16, 11:15:4
TimeZone: Asia/Shanghai, 2024-11-16, 11:15:4
TimeZone: America/Los_Angeles, 2023-11-15, 19:15:4

5.1 计算同一时间戳在不同时区下的时间点

    public static void main(String[] args) {
        long timeStamp = 1700104961;
        // UTC+08:00
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
        calendar.setTimeInMillis(timeStamp * 1000);
        printTimeInfo(calendar);
        // UTC-08:00
        Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
        calendar1.setTimeInMillis(timeStamp * 1000);
        printTimeInfo(calendar1);
    }
TimeZone: Asia/Shanghai, 2023-11-16, 11:22:41
TimeZone: America/Los_Angeles, 2023-11-15, 19:22:41

5.2 计算同一时间点在不同时区下对应的时间戳

如2023-10-18 9:25:30在不同时区下对应的时间戳。

    public static void main(String[] args) throws ParseException {
        String dateStr = "2023-10-18 9:25:30";

        // get the timeStamp at Asia/Shanghai
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        Date date1 = dateFormat.parse(dateStr);
        System.out.println(date1.getTime());


        //get the timeStamp at America/Los_Angeles
        dateFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
        Date date2 = dateFormat.parse(dateStr);
        System.out.println(date2.getTime());
    }
1697592330000
1697646330000

5.3 知道一个时区某个时间点的时间戳,计算另一时区该时间点的时间戳

如:知道1697592330000是"2023-10-18 9:25:30"在Asia/Shanghai下的时间戳,计算在America/Los_Angeles下"2023-10-18 9:25:30"对应的时间戳。

第一种方法:使用5.1计算,第二种方法使用相对国际标准时间的偏移量计算。假设时区A相对国际标准时间的偏移量为offsetA, 时区B偏移量为offsetB。那么B时区"2023-10-18 9:25:30"对应的时间戳为timeStampA + offsetA - offsetB。但是注意这个没考虑夏令时的问题。还是使用Calendar计算靠谱!

    public static void main(String[] args) throws ParseException {
        String dateStr = "2023-10-18 9:25:30";
        long MILLS_ONE_HOUR = 60 * 60 * 1000;

        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
        calendar.set(2023, Calendar.OCTOBER, 18, 9, 25, 30);
        System.out.println(calendar.getTimeInMillis());
        printTimeInfo(calendar);

        System.out.println(
                calendar.getTimeInMillis()
                        + TimeZone.getTimeZone("Asia/Shanghai").getRawOffset()
                        - TimeZone.getTimeZone("America/Los_Angeles").getRawOffset()
        );// 此时洛杉矶是夏令时,所以算出来快了一个小时。还是用下面的计算靠谱
        calendar.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
        calendar.set(2023, Calendar.OCTOBER, 18, 9, 25, 30);
        System.out.println(calendar.getTimeInMillis());
        printTimeInfo(calendar);
    }
1697592330226
TimeZone: Asia/Shanghai, 2023-10-18, 9:25:30
1697649930226
1697646330226
TimeZone: America/Los_Angeles, 2023-10-18, 9:25:30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152528.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何调整图片尺寸:简单实用的教程分享

报名事业编考试的时候&#xff0c;会发现上传照片时会提示图片大小尺寸应该为多少&#xff0c;如果不符合规定就无法提交报名&#xff0c;那么怎么才能修改图片大小呢&#xff1f;最简单的方法就是利用调整照片大小工具来对图片尺寸修改&#xff0c;本文分享一个在线图片处理工…

BLIP:统一视觉语言理解与生成的预训练模型

Li J, Li D, Xiong C, et al. Blip: Bootstrapping language-image pre-training for unified vision-language understanding and generation[C]//International Conference on Machine Learning. PMLR, 2022: 12888-12900. BLIP 是 Salesforce 在 2022 年的工作&#xff0c;文…

分布式锁~

分布式锁 分布式锁是在分布式系统中用于协调多个节点之间对共享资源的访问的一种机制。个人认为实现分布式锁&#xff0c;需要一个中间件例如数据库&#xff0c;redis等等这样的存储锁即可实现分布式锁。 分布式锁实现方案 基于数据库(唯一索引) 基于内存(redis&#xff0c;…

CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用

查看原文>>>最新CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用 气候变化对农业、生态系统、社会经济以及人类的生存与发展具有深远影响&#xff0c;是当前全球关注的核心议题之一。IPCC&#xff08;Intergovernmental Panel on Climate Change&#…

太激动了!摄像头终于有画面了!

有了放弃的想法 摄像头APP在我这里好好的&#xff0c;到了老外那里就不能 用。反复试了几套源码&#xff0c;都没有画面。后来干脆把老外说通用的APK反编译后&#xff0c;新做了个APP&#xff0c;结果还是没画面。到了这个时候&#xff0c;我是真的有点沮丧&#xff0c;准备放弃…

七、Nacos和Eureka的区别

一、nacos注册中心 二、临时实例与非临时实例 三、区别 Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式&#xff0c;非临时实例采用主动检测模式临时实例心跳不正常会被剔除&#xff0c;非临时实例则不会被剔除Nacos支持服务列表变更的消息推送模式&#xff0c;服务…

软件外包开发文档需要注意的问题

编写软件开发文档时需要注意以下一些关键问题&#xff0c;以确保文档的质量、有效性和可维护性&#xff0c;通过关注这些问题&#xff0c;您可以确保软件开发文档更容易被理解、使用和维护&#xff0c;从而提高项目的成功几率。北京木奇移动技术有限公司&#xff0c;专业的软件…

3.5-构建自己的Docker镜像

首先介绍两个命令&#xff1a; 1.docker container commit&#xff0c;可以简写为&#xff1a;docker commit。这个命令是把一个修改后的container重新变成一个image。 2.docker image build&#xff0c;可以简写为&#xff1a;docker build 首先&#xff0c;演示一下docker c…

接口中的大事务,该如何进行优化?

作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…

论文阅读:YOLOV: Making Still Image Object Detectors Great at Video Object Detection

发表时间&#xff1a;2023年3月5日 论文地址&#xff1a;https://arxiv.org/abs/2208.09686 项目地址&#xff1a;https://github.com/YuHengsss/YOLOV 视频物体检测&#xff08;VID&#xff09;具有挑战性&#xff0c;因为物体外观的高度变化以及一些帧的不同恶化。有利的信息…

CSS---关于font文本属性设置样式总结

目录 1、color属性 2、font-size属性 3、font-weight属性 4、font-family属性 5、text-align属性 6、line-height属性 7、text-indent属性 8、letter-spacing属性 9、word-spacing属性 10、word-break属性 11、white-space属性 12、text-transform 12、writing-mo…

Git常用操作-MD

文章目录 1. 本地创建分支&#xff0c;编写代码&#xff0c;提交本地分支到远程仓库2. 提交本地代码到本地仓库3. 提交本地代码到本地dev分支4. 提交本地dev分支到远程仓库5. 本地dev分支拉取远程master分支&#xff0c;并将master分支内容合并到本地dev6. 同义命令7. 撤销上次…

No matching version found for zr-map-ol@1.1.19.

问题描述&#xff1a; 通常情况下直接安装可能还会报错&#xff0c;因为有的依赖包是在私库里的 解决方法&#xff1a; 1.查看模块的注册信息 2. 安装 如果上面这种方式安装之后npm i还是报错&#xff0c;试试下面这种方式(我没有试下面的方式 上面的已经解决掉了) 具体可以参…

人工智能基础_机器学习038_中国人寿保费预测(EDA数据探索)_导包_数据探索_---人工智能工作笔记0078

注意 EDA是Exploratory Data Analysis(探索性数据分析)的缩写,它是一种统计分析方法,旨在了解数据的基本特征,并发现数据中的规律和模式。EDA通常是数据分析流程的开始阶段,主要使用可视化工具和统计指标来描述数据的基本特征,如数据的分布、中位数、均值、方差等。通过…

【前沿学习】美国零信任架构发展现状与趋势研究

转自&#xff1a;美国零信任架构发展现状与趋势研究 摘要 为了应对日趋严峻的网络安全威胁&#xff0c;美国不断加大对零信任架构的研究和应用。自 2022 年以来&#xff0c;美国发布了多个零信任战略和体系架构文件&#xff0c;开展了多项零信任应用项目。在介绍美国零信任战略…

C++初阶(十一)STL简介及string类初讲

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是STL二、STL的版本三、STL的六大组件四、STL的重要性五、如何学习STL六、STL的缺陷七…

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs 27.3.7 Modulation and coding scheme (HE-MCSs)27.3.8 HE-SIG-B modulation and coding schemes (HE-SIG-B-MCSs)27.5 Parameters for HE-MCSs27.5.1 General27.5.2 HE-MCSs for 26-tone RU27.5.3 HE-MCSs f…

Git-团队协作工作流

前言 一、工作流概述二、Git flow1.主要流程2.优缺点3.适用场景 三、Github flow1.主要流程2.优缺点3.适用场景 四、Gitlab flow1.主要流程2.优缺点3.适用场景 总结参考 一、工作流概述 开发人员通过Git可以记录和追踪代码的变化&#xff0c;包括添加、删除和修改文件。如果是…

【自动化测试】Appium环境搭建与配置-详细步骤,一篇带你打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Node.js环境搭…

【Python大数据笔记_day09_hive函数和调优】

hive函数 函数分类标准[重点] 原生分类标准: 内置函数 和 用户定义函数(UDF,UDAF,UDTF) ​ 分类标准扩大化: 本来&#xff0c;UDF 、UDAF、UDTF这3个标准是针对用户自定义函数分类的&#xff1b; 但是&#xff0c;现在可以将这个分类标准扩大到hive中所有的函数&#xff0c;…