Java开发笔记(一百五十三)时间戳的获取和转换
日期时间是Java一个重要的数据类型,常见的日期时间格式通常为“yyyy-MM-dd HH:mm:ss”,但是计算机中存储的日期时间并非字符串形式,而是长整型的时间戳。因为字符串又占用空间又难以运算,相比之下,长整型只占用四个字节,普通的加减乘除运算更是不在话下,所以时间戳是最佳的日期时间存储方案。
获取时间戳的代码很简单,只需调用System类的currentTimeMillis方法即可,如下所示:
// 从System类获取当前的时间戳
long timeFromSystem = System.currentTimeMillis();
System.out.println("timeFromSystem="+timeFromSystem);
众所周知,时间戳以毫秒为单位,为了求得它的计时起点,可以将其转换时间单位,先把毫秒的数量转成秒的数量,再把秒的数量转成分钟的数量,再把分钟的数量转成小时的数量,再把小时的数量转成天的数量,最后把天的数量转成年的数量。不过每年的天数不固定,像平年有365天,闰年有366天,按照四年一闰,平均每年的天数=(365+365+365+366)/4=365.25。于是把时间戳转为年份数量的代码就成了下面这样:
int years = (int) (timeFromSystem/1000/60/60/24/365.25);
System.out.println("years="+years);
运行上述转换代码,可见如下的输出日志:
timeFromSystem=1595578123444
years=50
由于当前年份是2020,从2020往前倒推50年,正好是1970年,原来时间戳是从1970年开始累加的呀。
通过System类只是获取时间戳的第一种方式,正如茴香豆的茴有四种写法那样,时间戳也有四种获取方式,除了之前提到的System类,还有下列三种时间戳获取方式:
1、从Date实例获取时间戳
调用Date实例的getTime方法即可获得对应的时间戳,获取代码示例如下:
// 从日期实例获取对应的时间戳
long timeFromDate = new Date().getTime();
System.out.println("timeFromDate="+timeFromDate);
2、从Calendar实例获取时间戳
调用Calendar实例的getTimeInMillis方法即可获得对应的时间戳,获取代码示例如下:
// 从日历实例获取对应的时间戳
long timeFromCalendar = Calendar.getInstance().getTimeInMillis();
System.out.println("timeFromCalendar="+timeFromCalendar);
3、从LocalDateTime实例获取时间戳
从LocalDateTime获取时间戳稍微麻烦些,得先把LocalDateTime实例转为Instant实例,再调用Instant实例的toEpochMilli方法获得对应的时间戳,获取代码示例如下:
// 从本地日期时间实例获取对应的时间戳
LocalDateTime localDateTime = LocalDateTime.now();
Instant instant1 = localDateTime.toInstant(ZoneOffset.ofHours(8));
long timeFromLocal1 = instant1.toEpochMilli();
System.out.println("timeFromLocal1="+timeFromLocal1);
上面获取代码基于北京时间,所以转为Instant实例时使用了东八区,倘若在东八区以外的其他地区运行上述代码,就无法得到正确的当地时间戳,此时要先设置当地的默认时区,再将LocalDateTime实例转为Instant实例,获取代码示例如下:
Instant instant2 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
long timeFromLocal2 = instant1.toEpochMilli();
System.out.println("timeFromLocal2="+timeFromLocal2);
尽管时间戳的获取方式多达四种,然而最高效的还是第一种System方式,它不但代码最简洁,时间消耗也最小。
有了时间戳之后,还能将它转换为对应的日期、日历和本地日期时间。转换过程说明如下:
1、把时间戳转换为Date类型,调用Date实例的setTime方法即可。
2、把时间戳转换为Calendar类型,调用Calendar实例的setTimeInMillis方法即可。
3、把时间戳转换为LocalDateTime类型,先调用Instant类的ofEpochMilli方法,把时间戳转成Instant实例;再调用LocalDateTime类的ofInstant方法,把Instant实例转成LocalDateTime实例。
下面是把时间戳转为日期、日历和本地日期时间的代码例子:
// 从System类获取当前的时间戳
long timestamp = System.currentTimeMillis();
// 下面把时间戳转换为日期实例
Date date = new Date();
date.setTime(timestamp);
// 下面把时间戳转换为日历实例
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
// 下面把时间戳转换为本地日期时间实例
Instant instant = Instant.ofEpochMilli(timestamp);
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(一百五十三)时间戳的获取和转换的更多相关文章
- Java开发笔记(五十三)关键字final的用法
前面介绍了多态的相关用法,可以看到一个子类从父类继承之后,便能假借父类的名义到处晃悠.这种机制在正常情况之下没啥问题,但有时为了预防意外发生,往往只接受当事人来处理,不希望它的儿子乃至孙子来瞎掺和.可 ...
- Java开发笔记(二十三)数组工具Arrays
数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...
- Java开发笔记(八十三)利用注解技术检查空指针
注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架.Mybatis框架,Android开发常见的Butt ...
- Java开发笔记(三十三)字符包装类型
正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...
- Java开发笔记(四十三)更好用的本地日期时间
话说Java一连设计了两套时间工具,分别是日期类型Date,以及日历类型Calendar,按理说用在编码开发中绰绰有余了.然而随着Java的日益广泛使用,人们还是发现了它们的种种弊端.且不说先天不良的 ...
- Java开发笔记(五十)几种开放性修饰符
前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...
- Java开发笔记(五十一)多态的发生场景
江湖上传闻,面向对象之所以厉害,是因为它拥有封装.继承与多态三项神技,只要三板斧一出,号令天下谁敢不从.前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明 ...
- Java开发笔记(五十二)对象的类型检查
前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...
- Java开发笔记(五十四)内部类和嵌套类
通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...
- Java开发笔记(五十五)关键字static的用法
前面介绍嵌套类的时候讲到了关键字static,用static修饰类,该类就变成了嵌套类.从嵌套类的用法可知,其它地方访问嵌套类之时,无需动态创建外层类的实例,直接创建嵌套类的实例就行.其实static ...
随机推荐
- 【Guava】并发编程ListenableFuture&Service
MoreExecutors directExecutor ExecutorService executor = Executors.newSingleThreadExecutor(); Settabl ...
- @Autowired原理
例子. // <bean id="> id默认类名首字母小写 默认是单例 // @Scope(value = "prototype") @Repository ...
- C#使用Blazor编译WebAssembly供前端调用(一),关于SkiaSharp相关问题
目前信创热潮开始掀起,而C#很多行业开发的都是桌面端,迁移到网页端常常会因为很多库不支持或者不友好导致项目一直卡着. 最近一直在网上找灵感,偶然发现Web Assembly,一开始我还没不知道这是什么 ...
- this 和super 关键字的区别
this关键字 (1) 每个类的每个非静态方法(没有被static修饰)都会隐含一个this关键字,它指向调用这个方法的对象:当在方法中使用本类属性时,都会隐含地使用this关键字,当然也可以明确使用 ...
- stackbd:在一个块设备上堆叠另一个块设备
stackbd 是一个虚拟的块设备,它作为另一个块设备的前端,如 USB 闪存盘或循环设备.它将I/O请求传递给底层设备,同时它打印请求信息用于调试.它还有可能修改请求. 堆叠块设备(stackbd) ...
- Excel导入操作,poi
导入操作,仅供参考,具体情况具体而论 @Override public ReturnObject inforImport(LogySbjsJdsbqxxxParts entity, HttpServl ...
- 47.9K star!全平台开源笔记神器,隐私安全首选!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "Joplin 是一款开源的笔记记录和待办事项应用,支持端到端加密同步,完美替代商 ...
- 如何把ASP.NET Core WebApi打造成Mcp Server
前言 MCP (Model Context Protocol)即模型上下文协议目前不要太火爆了,关于它是什么相信大家已经很熟悉了.目前主流的AI开发框架和AI工具都支持集成MCP,这也正是它的意义所在 ...
- 联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析.金融风控.智能交通等领域提供了创新解决方案.本文将基于FATE框架与P ...
- 【保姆级教程】:开源 Qwen3 本地化部署实操详细教程
一.教学环境 1.1Panel:现代化.开源Linux服务器管理面板 2.Ollama:开源大语言模型管理平台 3.MaxKB:强大易用的企业级 AI 助手 二.实操步骤 步骤1.1Panel 安装: ...