首页 > 其他分享 >System.currentTimeMillis()与时区无关

System.currentTimeMillis()与时区无关

时间:2023-08-13 12:24:36浏览次数:26  
标签:df System currentTimeMillis println TimeZone 时区

摘要:System.currentTimeMillis()获取的时间戳与时区无关。

综述

  System.currentTimeMillis()经常被用来获取当前时间戳,单位是毫秒,可以用来计算当前年月日或者星期几等,可以方便地与Date进行转换,可以计算某个方法的耗时:

long curTime = System.currentTimeMillis();
doSth();
System.out.println("耗时 = " + (System.currentTimeMillis()-curTime));

  正因为该方法是当前时间节点与0时区(1970-01-01 00:00:00 +0:00)相差的毫秒数,所以在这个时间节点,无论在哪个时区获取时间戳,其值丝毫不差。

测试用例

  如何验证它不会因为时区不同而返回不同的数值呢?测试用例很简单:调用函数TimeZone.setDefault(TimeZone zone)初始化操作系统时区为上海,打印一次时间戳的计算结果,接着切换操作系统的时区到东京,再运行一次,得到时间戳2。时间戳2和时间戳1的差值,等于切换时区的耗时,看看此耗时是否非常地小;为了使得实验效果更理想,每次切换时区都打印时分秒格式的当前时间,而且加了一组巴黎时区的数据。

    public static void main(String[] args) throws InterruptedException {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        long timestamp1 = System.currentTimeMillis();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(new Date()));

        System.out.println("时间戳: " + timestamp1 + ",OS time zone: " + ZoneId.systemDefault());
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
        long timestamp2 = System.currentTimeMillis();
        df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(new Date()));
        System.out.println("时间戳: " + timestamp2 + ",OS time zone: " + ZoneId.systemDefault());
        System.out.println("timestamp2 - timestamp1 = " + (timestamp2 - timestamp1));

        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));
        long timestamp3 = System.currentTimeMillis();
        df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(new Date()));
        System.out.println("时间戳: " + timestamp3 + ",OS time zone: " + ZoneId.systemDefault());
        System.out.println("timestamp3 - timestamp1 = " + (timestamp3 - timestamp1));
    }

实验结果如下:

2023-08-05 12:20:59
时间戳: 1691209259885,OS time zone: Asia/Shanghai
2023-08-05 13:21:00
时间戳: 1691209260033,OS time zone: Asia/Tokyo
timestamp2 - timestamp1 = 148
2023-08-05 06:21:00
时间戳: 1691209260035,OS time zone: Europe/Paris
timestamp3 - timestamp1 = 150

  分析实验结果可知:

  1. 函数System.currentTimeMillis()与时区毫无瓜葛。
  2. df.format(new Date()) 的执行结果和时区休戚相关。其实,SimpleDateFormat的对象df可以调用函数df.setTimeZone(TimeZone.getTimeZone("UTC"))设置时区。

  关于时间的存储和显示问题,基于数据的存储和显示相分离是非常基础的设计原则,在数据库存储时间的时候,只保存表示绝对时间的Long型时间戳,不用顾虑应用服务器和数据库服务器的时区设置问题,在显示给用户的时候,根据用户设置的时区转换为字符串。

小结

  函数System.currentTimeMillis()获取的时间戳与时区无关。基于时间戳的时间存储不存在时区的问题,时区只与页面显示绑定。也就是说,在进行时间戳和日期之间的转换时,需要根据不同的时区进行计算,以防止出现时间偏差。

标签:df,System,currentTimeMillis,println,TimeZone,时区
From: https://www.cnblogs.com/east7/p/17626379.html

相关文章

  • System.currentTimeMillis()高并发性能优化
    摘要:System.currentTimeMillis()性能问题的研究、测试与优化。  性能优化使用的测试环境:jdk版本jdk8  操作系统:macOS版本:13.2.1芯片:AppleM1CPU核数:8核  System.currentTimeMillis()是Java极其常用的API,广泛地用来获取时间戳或统计代码执行耗时等,在我们的......
  • Android系统启动-SystemServer上篇-1
    相关文件:/frameworks/base/core/java/com/android/internal/os/-ZygoteInit.java-RuntimeInit.java-Zygote.java/frameworks/base/services/java/com/android/server/-SystemServer.java/frameworks/base/core/jni/-com_android_internal_os_Zygote.cp......
  • SystemExit异常 sys.exit()​​函数
    这个错误是SystemExit,它是Python中的一个异常类。当调用sys.exit()函数时,会引发SystemExit异常,这个函数用于退出程序。在你的代码中,sys.exit(0)被调用,参数0表示正常退出程序。在这种情况下,fun_read()函数中的某个条件被满足,导致程序调用了sys.exit(0)来退出。这可能是为了在某些情......
  • system.getProperty是一个用于获取系统属性的方法
    system.getProperty是一个用于获取系统属性的方法。系统属性是指与特定运行环境相关的参数和配置信息,通过该方法可以获取这些信息并对程序进行适当的调整和优化。1.什么是系统属性?系统属性是通过系统的配置文件或命令行参数来设置的一些参数和配置信息。腻子粉网站可以影响程序......
  • Debug Assertion Failed! Program: C:\Windows\SYSTEM32\mfc140ud.dll
    新建C++ MFC项目多文本对话框的模板,运行出错。解决办法:这是由于DockControlBar(&m_wndToolBar);引起的异常。在头文件MainFrm.h中重新定义  CMFCToolBar m_wndToolBar; 类型DockControlBar(&m_wndToolBar)改为DockPane(&m_wndToolBar);再次运行就不会出错了。......
  • Linux系统修改时区
    本文以修改印度孟买时区为例,请您参考以下步骤进行操作。执行以下命令更新时区。ln-sf/usr/share/zoneinfo/Asia/Colombo/etc/localtime说明:印度有些地区会使用/usr/share/zoneinfo/Asia/Colombo这个GMT+05:30的时间。执行以下命令更新硬件时钟(RTC)。hwclock-w执行以下命令重启......
  • Linux服务器修改时区时间
         时间的一致性很关键,对于日志的分析和程序的对接都至关重要!01、tzselect 修改时区可以使用命令tzselect,修改时区。操作示例:$ tzselectPleaseidentifyalocationsothattimezonerulescanbesetcorrectly.Pleaseselectacontinentorocean.1)Africa2......
  • Linux 更改时区、时间
    一、手动修改1.date命令:查看当前时间2. date-s 时分秒:修改时间还需要把日期改过来3. date-s 完整日期时间(YYYY-MM-DDhh:mm[:ss]):修改日期、时间时间要用双引号括起来,否则报错手动修改会存在一定的时间误差4. hwclock-w将时间写入bios避免重启失效。当我们进行完Li......
  • HarmonyOS/OpenHarmony应用开发-ArkTSAPI系统能力SystemCapability列表
    SysCap,全称SystemCapability,即系统能力,指操作系统中每一个相对独立的特性。开发者使用某个接口进行开发前,建议先阅读系统能力使用说明,了解Syscap的定义和使用指导。说明当前列表枚举出3.1Beta版本中支持的系统能力。开发者可以在SDK中通过phone.json文件查询。SystemCapability.Ar......
  • ThinkSystem SR系列 服务器配置RAID和BMC
    ThinkSystemSR系列服务器配置RAID和BMC前提条件:准备一台笔记本,一根网线,直连服务器imm网卡。1、修改笔记本ip与服务器默认带外管理ip(192.168.70.125)同网段,不同服务器默认ip可能有所不同。2、浏览器输入https://192.168.70.125 默认账号密码,登录xcc管理平台,然后打开......