摘要: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()获取的时间戳与时区无关。基于时间戳的时间存储不存在时区的问题,时区只与页面显示绑定。也就是说,在进行时间戳和日期之间的转换时,需要根据不同的时区进行计算,以防止出现时间偏差。

System.currentTimeMillis()与时区无关的更多相关文章

  1. System.nanoTime与System.currentTimeMillis的理解与区别

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. 平时产生随机数时我们经常拿时间做种子,比如用System.currentTimeMillis的结果 ...

  2. System.nanoTime与System.currentTimeMillis的区别

    平时产生随机数时我们经常拿时间做种子,比如用 System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结 果将会差 ...

  3. JAVA获取当前系统时间System.currentTimeMillis()

    System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,Date()其实就是相当于Date(System.currentTimeMi ...

  4. System.nanoTime与System.currentTimeMillis的区别(转)

    原文地址:http://blog.csdn.net/dliyuedong/article/details/8806868 平时产生随机数时我们经常拿时间做种子,比如用System.currentTim ...

  5. new Date().getTime()和System.currentTimeMillis()对比

    我在工作中,看项目组的代码时,在代码中会发现一个有趣的现象,有使用new Date().getTime()来获取时间戳的, 也有使用System.currentTimeMillis()来获取时间戳的, ...

  6. 我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别

    首先来看一道题:下面代码的输出结果是什么? import java.util.HashMap; import java.util.Map; public class HashMapTest { pub ...

  7. JAVA获取当前系统时间System.currentTimeMillis()以及获取运行时间

    System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,Date()其实就是相当于Date(System.currentTimeMi ...

  8. java的System.currentTimeMillis()如何转换成C#的DateTime.Now.Ticks?

    考虑到我们是东八时区的话,应做如下转换: long milli = System.currentTimeMillis() + 8*3600*1000; long ticks = (milli*1000 ...

  9. 由system.currentTimeMillis() 获得当前的时间

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...

  10. c# 实现 java 的 System.currentTimeMillis() 值

    本文地址:http://www.cnblogs.com/jying/p/3875331.html 以下一句即可实现 java 中的 System.currentTimeMillis() 值 , , , ...

随机推荐

  1. Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

    引言:AI技术新纪元的破局者 2025年3月6日凌晨,武汉Monica团队正式发布全球首款通用AI代理系统Manus,该工具在GitHub开源社区引发热议,单日Star数突破5万.与传统对话式AI不同 ...

  2. 华为平板+Zotero+Xodo+坚果云+Zotfile+Zotero OCR,实现论文笔记平板手写+Win自动生成,补充官方教程

    需要的硬件,软件,插件和实现的最终效果,rt. 1. Win,下载Zotero,坚果云 下载网址:https://www.zotero.org/download/ 版本:Zotero 6.如果是其他版 ...

  3. JOKER 低代码平台 20250313 重磅更新:全方位升级,解锁开发新体验

    JOKER 低代码平台于 2025 年 3 月 13 日迎来了一次全面且深度的升级.本次更新聚焦前端交互.服务端功能以及通用操作等多个关键领域,致力于打造更卓越的开发环境,为开发者们带来更加高效.稳定 ...

  4. emlog 制作一个小插件(截取正文生成 xx 字摘要)的过程

    blockquote { background: rgba(255, 255, 0, 1); color: rgba(255, 0, 0, 1) !important } 如果熟悉其他 PHP 平台的 ...

  5. 使用 PHP 创建 Excel 读取器类

    介绍: PHPExcel-1.8.1读取excel 创建 ExcelReader 类: ExcelReader 类旨在从 Excel 文件中读取数据.它以文件路径作为输入,并提供一个方法来从 Exce ...

  6. 从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画

    QGraphicsItem 有3种方式进行变换:1. 最简单方便的是使用 setRotation() .setScale():2. 使用 setTransform() 进行复杂变换:3. 还可以使用 ...

  7. addAll(Collection<? extends E> c)的方法源码

    public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...

  8. java基础之二分查找,可变参运用

    一. public class BinarySeachTest { public static void main(String[] args) { int[] arr = new int[]{22, ...

  9. 🔥Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy

    简介 在Elasticsearch 7.x版本中,当更新数据时(例如索引.更新或删除文档),这些更改并不会立即对搜索可见.为了让这些更改能够被搜索到,需要了解和选择合适的刷新策略(Refresh Po ...

  10. python调用QQ机器人向指定QQ发消息

    暂时没想到这个能用来干什么,只是刚好看到相关文章,学习一下,就拿获取基金信息来做试验把 爬取基金的信息就不介绍了,请参考https://www.cnblogs.com/becks/p/14500495 ...