calendar类计算时间距离_日期时间--JAVA成长之路

Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hold住这堆东西了。

常用的类

表示类

  • java.util.Date :能够准确记录到毫秒级别的时间表示类,但是其中的各种get set(修改时间或者获取时间中某一个特殊参数)都已经被废弃。

  • java.sql.Date :为数据库提供的日期类,继承自util包中的Date,但是这个类只能够操作日期,不能读取或者修改时间。sql和util中Date内部进行存储的long,都可以保存到毫秒级别

  • java.sql.Time :为数据库提供的时间类,和Date相反,它只能获取和操作时间相关的信息。

  • java.sql.Timestamp:时间戳,继承util.Date,它不仅能够完美支持util.Date的功能,而且可以支持到纳秒级别(10^-9 s)。

工具类

  • Calendar:主要用来操作一个Date类型,提供了一系列接口来获取或修改其中的信息。

  • TimeZone:用来配合Calendar 操作Date,主要是考虑时区的问题,值得注意的是,在Date中存储的信息是一个绝对标准时间(稍后说明),而如果需要进行时区的转化,那么只需要配合此类即可。

  • SimpleDateFormat:常用的格式化Date的工具,主要是进行String和日期之间的互换。

基本概念

时间的来源

注意,这里并不是讨论一个哲学的问题,在大部分的编程语言中,我们都是采用从1970-01-01 00:00:00.000 开始至今的毫秒差作为表示时间的数值,这个时间是绝对公立的,它和时区没有任何关系。在Java中任何时间的表示类的底层存储的毫秒数都是一个这样的标准时间。

在java中获取当前时间接口是System.currentTimeMillis()

值得一提的是Java还提供了一个更加精确的时间:System.nanoTime(),获取一个时间精确到纳秒,但是它并不是一个当前的精确时间,而是JVM提供的一个时间,它的主要用途是来精确衡量两个时间段之间的时间,如计算一段代码的执行时间:

long startTime = System.nanoTime();   // ... the code being measured ...   long estimatedTime = System.nanoTime() - startTime;

可以比较两个接口返回的内容:System.currentTimeMillis():1429108246639System.nanoTime():1429108246640(ms)089000------->多了6位

UTC和GMT

这两个标准唯一不同之处在于UTC是基于GMT进行微调之后的一个时间,本文不去深究这两者的差别,在此认为这两者是一个东西。

初中地理教过我们,地球是24个时区,东部和西部各12个,时区的基准点是伦敦(基准UTC),往东,会领先UTC,往西,会落后UTC。

如北京属于东八区,那么我们的时间会领先基准,也就是我们在早上9点时,伦敦是早上1点。如果我们在不同时区接发邮件的时候,可以发现这个问题。

这个时间是我收到一份来自华盛顿的邮件的时间:

2014年1月23日(星期四) 晚上7:29 (UTC-05:00 华盛顿、多伦多、古巴、智利时间)

这里我们可以在邮件时间后面发现UTC-05:00,说明这里是落后UTC基准5个小时。注意,前面的时间是发件人的本地时间,如果转化成北京所在时区的时间应该是加上13h,那我收到这封邮件的本地时间是:2014-01-24 星期五早上8:29。

再谈TimeStamp

前面说了,TimeStamp能够精确到纳秒,那它是怎么做到的呢?由于TimeStamp继承自Date,它把整数秒存储在超类中,而在子类中专门用一个long类型存储零的秒数:nanos

需要注意,除非你显示去调用TimeStamp的这个构造器:public Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)

显示去指定nano的值,否则这个构造器的参数public Timestamp(long time)

的单位实际上是毫秒。

API的使用

最后再来说说日期时间的操作接口,过程基本如下图:

           SimpleDateFormat   Date    Calendar

Date负责存储一个绝对时间,并对两边提供操作接口。Calendar负责对Date中特定信息,比如这个时间是改年的第几个星期,此外,还可以通过set,add,roll接口来进行日期时间的增减。SimpleDateFormat主要作为一些格式化的输入输出。

SimpleDateFormat

SimpleDateFormat的构造器接受一个String pattern,其中的pattern是预定义的:

G 年代标志符y 年M 月d 日h 时 在上午或下午 (1~12)H 时 在一天中 (0~23)m 分s 秒S 毫秒E 星期D 一年中的第几天F 一月中第几个星期几w 一年中第几个星期W 一月中第几个星期a 上午 / 下午 标记符k 时 在一天中 (1~24)K 时 在上午或下午 (0~11)z 时区

例子1:

 SimpleDateFormat DATETIME_FORMATER_WITHWEEK = new SimpleDateFormat(            "yyyy-MM-dd E HH:mm");    java.util.Date date = new java.util.Date();    System.out.println(DATETIME_FORMATER_WITHWEEK.format(date));        //output: 2015-04-15 星期三 23:59     //当然,反过来,我也可以使用这个format将output的字符串转化成Date

Calendar

Calendar中主要需要了解的各种操作域,感觉这也是Java在做这个API时的一个败笔,灵活有余,可控性不足,初学者如果乱用域,将会产生各种bug。至于每一个域对应的时间分量,请自行google。

一些常用的filed:

  • YEAR:年

  • MONTH:月(从0 开始,0 表示1月....11表示12月)

  • DAY_OF_MONTH :几号(等同DATE)

  • DAY_OF_WEEK:星期几

  • DAY_OF_YEAR:年里面的天

  • DATE:几号(等同DAY_OF_MONTH)

一个filed通常来说对应了日期时间中的某一个分量,在操作这个分类有些操作会向高位进位,而有的操作则不会【bug高发区域】。

例子2:

SimpleDateFormat DATETIME_FORMATER_WITHWEEK = new SimpleDateFormat(     "yyyy-MM-dd E");    Calendar calendarT = Calendar.getInstance(Locale.CHINA);    System.out.println(DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));    calendarT.set(Calendar.MONTH,12);// 月份进位    System.out.println(DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));    //output:2015-04-16 星期四2016-01-16 星期六

例子3:

        SimpleDateFormat DATETIME_FORMATER_WITHWEEK = new SimpleDateFormat(     "yyyy-MM-dd E");    Calendar calendarT = Calendar.getInstance(Locale.CHINA);    System.out.println("原始    :"+DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));    calendarT.set(Calendar.DAY_OF_MONTH,1);// 当月第一天    System.out.println("当月第一天:"+DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));    //roll不会进位    calendarT.roll(Calendar.DATE,-1);    System.out.println("roll -1:"+DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));    calendarT.set(Calendar.DAY_OF_MONTH,1);// 当月第一天    calendarT.add(Calendar.DATE,-1);    //add产生进位    System.out.println("add -1:"+DATETIME_FORMATER_WITHWEEK.format(calendarT.getTime()));        //output:原始    :2015-04-16 星期四当月第一天:2015-04-01 星期三roll -1:2015-04-30 星期四add -1:2015-03-31 星期二

最后还是需要说明一点,获取当前时间指的是当前本地时间对应的UTC时间,和时区没有关系!有点绕,没关系看代码:

例子4:

Calendar calendar1 = Calendar.getInstance(Locale.CHINA);    Calendar calendar2 = Calendar.getInstance(Locale.GERMAN);    System.out.println(calendar1.getTimeInMillis());    System.out.println(calendar2.getTimeInMillis());        //output:    14291151501171429115150117

日期处理开源库:joda-time

706c0e42b272230d73cd545ac37aac44.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5章 Python 数字图像处理(DIP) - 图像复原与重建4 - 指数噪声

标题指数噪声指数噪声 指数噪声的PDF为 P(z){ae−az,z≥00,z<0(5.10)P(z) \begin{cases} ae^{-az}, & z\geq 0 \\ 0, & z < 0 \end{cases} \tag{5.10}P(z){ae−az,0,​z≥0z<0​(5.10) 均值和方差为 zˉ1a(5.11)\bar{z} \frac{1}{a} \tag{5.11}zˉa1​(5.…

第5章 Python 数字图像处理(DIP) - 图像复原与重建5 - 均匀噪声

标题均匀噪声均匀噪声 均匀噪声的PDF为 P(z){1b−a,a≤z≤b0,other(5.13)P(z) \begin{cases}\frac{1}{b-a}, & a\leq z \leq b \\ 0, & \text{other}\end{cases} \tag{5.13}P(z){b−a1​,0,​a≤z≤bother​(5.13) 均值和方差为 zˉab2(5.14)\bar{z} \frac{a b}{2…

jquery实现的3D缩略图悬停效果

今天我们要告诉你如何创建一些令人兴奋的3D使用CSS3和jQuery悬停效果。这一想法的灵感来自于凉爽的悬停效果&#xff0c;再给客户做网站的时候用的这样的效果&#xff0c;今天就共享出来 在这个效果当中&#xff0c;我将使用的thumbails&#xff0c;就会发现一些更多的信息悬停…

python网页爬虫例子_Python 利用Python编写简单网络爬虫实例3

利用Python编写简单网络爬虫实例3 by:授客 QQ&#xff1a;1033553122 实验环境 python版本&#xff1a;3.3.5&#xff08;2.7下报错 实验目的 获取目标网站“http://bbs.51testing.com/forum.php”中特定url&#xff0c;通过分析发现&#xff0c;目标url同其它url的关系如下目标…

登陆SharePoint站点出现service unavailable----Http错误503

今天在登陆SharePoint站点时&#xff0c;遇到服务不可用&#xff0c;Http error 503。建议如下操作&#xff1a; 1. 在IIS中检查站点属性。在“起始页”&#xff0c;检查应用程序池。 2. 发现SharePoint Web Services Root已停止&#xff0c;右键启动。问题得到解决。 PS&#…

C# 数组

什么是数组&#xff1f;数组是一种数据结构&#xff0c;包含同一个类型的多个元素。数组的声明&#xff1a;int[] myIntArray; 注&#xff1a;声明数组时&#xff0c;方括号 ([]) 必须跟在类型后面&#xff0c;而不是变量名后面。在 C# 中&#xff0c;将方括号放在变量名后是不…

Downloading Android Source Code

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件&#xff0c;它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓 库&#xff08;repository&#xff09;&#xff0c;许多个工作目录&#xff08…

第5章 Python 数字图像处理(DIP) - 图像复原与重建6 - 椒盐噪声

标题椒盐噪声椒盐噪声 如果kkk是一幅数字图像中表示灰度值的比特数&#xff0c;则灰度值可能是[0,2k−1][0, 2^k -1][0,2k−1]。椒盐噪声的PDF为&#xff1a; P(z){Ps,z2k−1Pp,z01−(PsPp),zV(5.16)P(z) \begin{cases} P_s, & z 2^k -1 \\ P_p, & z0 \\ 1-(P_s P_…

Keras 深度学习框架中文文档

2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网&#xff1a;http://keras.io/Github项目&#xff1a;https://github.com/fchollet/keras中文文档主页&#xff1a;http://keras-cn.readthedocs.io/en/latest/Github中文文档&#…

求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...

数组作为函数的参数[1]数组元素作实参&#xff0c;与单个变量一样。数组名作参数&#xff0c;形、实参数都应是数组名&#xff08;实质上是地址&#xff0c;关于地址详见后续章节&#xff09;&#xff0c;类型要一样&#xff0c;传送的是数组首地址。对形参数组的改变会直接影响…

android p wifi一直在扫描_Android再次解读萤石云视频

点击上方蓝字关注 ??前言我之前写过一篇萤石云的集成文章&#xff0c;很多人问我有没有demo&#xff0c; 今天我再次总结一下&#xff0c; 并加个些功能。集成步骤视频预览播放视频放大缩小视频的质量切换截图之前的文章大家可以看下面的链接&#xff1a;https://mp.weixin.q…

第5章 Python 数字图像处理(DIP) - 图像复原与重建7 - 周期噪声 余弦噪声生成方法

标题周期噪声周期噪声 周期噪声通常是在获取图像期间由电气或机电干扰产生的 def add_sin_noise(img, scale1, angle0):"""add sin noise for imageparam: img: input image, 1 channel, dtypeuint8param: scale: sin scaler, smaller than 1, will enlarge, …

第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数

标题估计噪声参数估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的。 只能使用由传感器生成的图像时&#xff0c;可由一小片恒定的背景灰度来估计PDF的参数。 来自图像条带的数据的最简单用途是&#xff0c;计算灰度级的均值和方差。考虑由SSS表示的一个条…

python 随机获取数组元素_Python创建二维数组的正确姿势

List &#xff08;列表&#xff09;是 Python 中最基本的数据结构。在用法上&#xff0c;它有点类似数组&#xff0c;因为每个列表都有一个下标&#xff0c;下标从 0 开始。因此&#xff0c;我们可以使用 list[1] 来获取下标对应的值。如果我们深入下列表的底层原理&#xff0c…

在ubunut下使用pycharm和eclipse进行python远程调试

我比较喜欢Pycharm&#xff0c;因为这个是JetBrains公司出的python IDE工具&#xff0c;该公司下的java IDE工具——IDEA&#xff0c;无论从界面还是操作上都甩eclipse几条街&#xff0c;但项目组里有些人使用eclipse比较久了&#xff0c;一时让他们转pycharm比较困难&#xff…

CSS:页脚紧贴底部

2019独角兽企业重金招聘Python工程师标准>>> 我的练习来源于《CSS揭秘》这本书第7章-41紧贴底部的页脚这部分内容以及书中提到的链接。 方案一 描述&#xff1a;以下方案简单、干净、现代并且没有hack&#xff0c;适用于IE8, Chrome, Firefox, Opera等浏览器&#x…

第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

标题只存在噪声的复原 - 空间滤波均值滤波器算术平均滤波器几何均值滤波器谐波平均滤波器反&#xff08;逆&#xff09;谐波平均滤波器只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)f(x,y)η(x,y)(5.21)g(x, y) f(x, y) \eta(x, y) \tag{5.21}g(x,y)f(x,y)η(x,y)(5…

第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器

标题统计排序滤波器中值、最大值、最小值、中点 滤波器修正阿尔法均值滤波器统计排序滤波器 中值、最大值、最小值、中点 滤波器 f^(x,y)median{g(r,c)}(5.27)\hat{f}(x, y) \text{median} \{g(r,c)\} \tag{5.27}f^​(x,y)median{g(r,c)}(5.27) f^(x,y))max{g(r,c)}(5.28)\ha…

如何设置坐标原点值_氨气检测仪电化学原理及报警值如何设置

氨气体检测仪检定规程&#xff1a;一般氨气体检测仪检定规程主要是针对技术参数设定的一些标准&#xff0c;具体包含有规程的名称和范围、仪器示值误差、充分性标准差、响应时间、稳定性、报警功能、流量控制器、检定项目表、检定操作有数值误差、重复性、响应时间、稳定性等。…

第5章 Python 数字图像处理(DIP) - 图像复原与重建11 - 空间滤波 - 自适应滤波器 - 自适应局部降噪、自适应中值滤波器

标题自适应滤波器自适应局部降噪滤波器自适应中值滤波器自适应滤波器 自适应局部降噪滤波器 均值是计算平均值的区域上的平均灰度&#xff0c;方差是该区域上的图像对比度 g(x,y)g(x, y)g(x,y)噪声图像在(x,y)(x, y)(x,y)处的值 ση2\sigma_{\eta}^2ση2​ 为噪声的方差&am…