文档章节

读懂程序里的--时间

-悟空-
 -悟空-
发布于 2015/09/27 18:02
字数 1841
阅读 301
收藏 6

题外话,祝各位程序猿们中秋佳节快乐~~~O(∩_∩)O~。 ##追本溯源 ###历史

####GMT 百度百科:格林威治时间 ####UTC 百度百科:协调世界时

两者比较:

GMT:最初确立的世界标准时间,名字由来是因为英国的皇家格林尼治天文台而得名,因为本初子午线被定义在通过那里的经线。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此,格林尼治时间已经不再被作为标准时间使用。新的标准时间,是由原子钟报时的协调世界时(UTC)。--百度百科

UTC:是目前使用的世界标准时间,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时。国际原子时的误差为每日数纳秒,而世界时的误差为每日数毫秒。对于这种情况,一种称为协调世界时的折衷时标于1972年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有需要的情况下会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局负责决定何时加入闰秒。 --维基百科

这里要提下有趣的事情是,因为UTC闰秒的缘故,java中的秒可能为60或61,但java文档中有说这个是依据计算机的环境,无法保证准确性囧。 根据这两个比较,GMT和UTC在正常生活中可以指同一个时间,除非你做的东西对时间的准确性极为敏感。

###一些重要概念: ####时区 1884年国际经线会议规定,全球按经度分为24个时区,每区各占经度15°。 以本初子午线为中央经线的时区为零时区,由零时区向东、西各分12区,东、西12区都是半时区,共同使用180°经线的地方时。

####CST :China Standard Time UTC+8:00 中国标准时间(北京时间),在东八区 俺们这块的时区就是 UTC +8 ,相当于我们国家的使用的时间比世界协调时间快了8小时。

####unix时间戳 是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 这里在放一个链接,关于为什么都要从1970年算起,以前也真是懒的思考这个问题,拿来就用,以后真的需要做什么事情都先问个为什么了。O(∩_∩)O哈哈~ 计算机时间、unix时间、linux时间、java时间为何以1970年1月1日为原点?从1970年1月1日开始计算? 百度百科:unix时间戳

##java中使用 ###时间类 timeStamp date Calendar


    long millisTime = System.currentTimeMillis();
	Timestamp timestamp = new Timestamp(millisTime);
	Time time = new Time(millisTime);
	Date date = new Date(millisTime);
	Calendar calendar = Calendar.getInstance();
	
	System.out.println(time.getTime());
	System.out.println(date.getTime());
	System.out.println(timestamp.getTime());
	System.out.println(calendar.getTimeInMillis());

以上构建之后,输出的都是同样的值,因为前三个是返回是距离January 1, 1970, 00:00:00 GMT的毫秒,而calendar返回的是the current time as UTC milliseconds from the epoch。上面说了GMT和UTC可以看成指同一个时间。所以值就是一样的了。一般网络通信传输时间都是先转成毫秒之后再转回来,因为这里面不会包含时区,这样才是准确的。

在java程序中一般都会使用Calendar因为其他几个类里面的方法几乎都不建议使用了,Calendar中提供了丰富的api,各位程序猿们使用的时候可以自行查找。

    Calendar calendar = Calendar.getInstance();
    //获取所有时区信息
	TimeZone.getAvailableIDs();
	//设置一个时区
	calendar.setTimeZone(TimeZone.getTimeZone("GMT+13"));
	//打印该时区目前小时时间,24制
	System.out.println(calendar.get(calendar.HOUR_OF_DAY));

###格式化时间显示类SimpleDateFormat

顺带再提下Java的SimpleDateFormat类,用来把时间格式化显示的,显示的样式很丰富,看下列表格列举的。

LetterDate or Time ComponentPresentationExamples
GEra designatorTextAD
yYearYear1996; 96
MMonth in yearMonthJuly; Jul; 07
wWeek in yearNumber27
WWeek in monthNumber2
DDay in yearNumber189
dDay in monthNumber10
FDay of week in monthNumber2
EDay in weekTextTuesday; Tue
aAm/pm markerTextPM
HHour in day (0-23)Number0
kHour in day (1-24)Number24
KHour in am/pm (0-11)Number0
hHour in am/pm (1-12)Number12
mMinute in hourNumber30
sSecond in minuteNumber55
SMillisecondNumber978
zTime zoneGeneral time zonePacific Standard Time; PST; GMT-08:00
ZTime zoneRFC 822 time zone-0800

下面这个方法是我在这里How to convert a String to a Date using SimpleDateFormat?看到的。 相比惯例的格式化时间方法,是把每种格式类型都定义好之后再用分别的方法调用,这个写成了一个统一的方法,虽然效率上没有改进,但是这种写法还是对可阅读性有了不少的提高啊。


/**
     * Format a time from a given format to given target format
     * 
     * @param inputFormat
     * @param inputTimeStamp
     * @param outputFormat
     * @return
     * @throws ParseException
     */
    private static String TimeStampConverter(final String inputFormat,
            String inputTimeStamp, final String outputFormat)
            throws ParseException {
        return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat(
                inputFormat).parse(inputTimeStamp));
    }

##头痛的mysql中时间的使用

###各有千秋 我们来一一介绍下mysql中的时间, DATE 显示的格式为YYYY-MM-DD 范围从 '1000-01-01' 到 '9999-12-31' 占用3个字节

DATETIME 显示的格式为YYYY-MM-DD HH:MM:SS 范围从'1000-01-01 00:00:00' 到'9999-12-31 23:59:59' 占用8个字节

TIMESTAMP 显示的格式YYYY-MM-DD HH:MM:SS 范围从'1970-01-01 00:00:01'到 '2038-01-19 03:14:07' 占用4个字节 相信各位如果读了上面unix时间戳的来历,应该明白为什么占用4个字节。

区别:

  1. 首先要提的就是datetimetimestamp之间最大的不同就是在于,timestamp随着时区的变化而变化,默认会根据系统的时区设置来存储时间,打个比方,如果你在东八区存储一个时间,之后把数据库系统设置另一个时区则取出来的值发生变化。如果你存储数据的库分布在不同的时区时你就要考虑这种情况,而采用datetime,因为它是不受时区影响的。
  2. 三种时间格式的非法值都会变成'0000-00-00' 或 '0000-00-00 00:00:00'
  3. timestamp提供了每次数据更新时,自动更新为现有的时间功能,这个功能比较有用。
  4. date会自动处理一些格式比如'10:11:12'会理解成'2010-11-12',年值在'00-69'mysql会认为是'2000-2269',年值在'70-99'mysql会认为'1970-1999'话说mysql还算智能哈。

参考文章: The DATE, DATETIME, and TIMESTAMP Types java编程中遇到的时区与时间问题总结 How to convert a String to a Date using SimpleDateFormat? 计算机时间、unix时间、linux时间、java时间为何以1970年1月1日为原点?从1970年1月1日开始计算? 协调世界时 格林威治时间 unix时间戳

© 著作权归作者所有

-悟空-

-悟空-

粉丝 145
博文 25
码字总数 35562
作品 0
海淀
高级程序员
私信 提问
Ruby 编程中拼写错误的救星:did_you_mean gem

经常我会在Ruby开发中遇到拼写错类名或方法名的时候,程序报错,但我不知道只是拼写错误,我会反复的咕噜: “太奇怪了,看起来完全没问题呀…” 经常我会在这种事情上浪费大量的时间,而原因...

oschina
2014/10/29
1K
6
时间简史:读完了多少,读懂了多少

读完这本书,仅仅用读完来形容了。这书里面的有许多的知识都是我无法去理解的。果然发现,这是一本不符合畅销书的畅销书了。这本书里,虽然没有提到多少公式性的推到,只放了一个 爱因斯坦质...

小浊微清
2018/07/29
0
0
做事情的方法常常比事情本身更重要

开头先讲两个例子。 1.此时有几张大小固定的照片(例如手机截图),你需要拼在一起,并且打上水印你会怎么办? 2B青年:打开画图工具或者PS之类的软件,开始一张张合并,加水印。 普通...

momo李
2016/12/24
0
0
像建筑设计师一样去写程序

写代码和写文章,从某种程度上是相通的,需要逻辑、构架,也要尽可能的简练。我们之前说过,创作者的时间表和管理者的时间表是不一样的,编代码和写文章,都是一个孤独而不能受到干扰的过程,...

oschina
2013/01/28
4K
30
零基础Python新手应该怎么去学习?

对于完全没有编程经验的初学者,在学习python的时候,面对的不仅仅是python这门语言,还需要面临“编程”的一些普遍问题,比如: 从零开始,不知道从何入手,找了本编程教材发现第二章开始就...

铁扇公主1
2017/04/27
759
1

没有更多内容

加载失败,请刷新页面

加载更多

ViewPager懒加载极致优化

目录介绍 01.ViewPager简单介绍 02.ViewPager弊端分析 03.ViewPager预加载 04.ViewPager部分源码 05.懒加载出现问题 06.如何实现预加载机制 07.懒加载配合状态管理器 吕诗禹想换个工作,渴望...

杨充
22分钟前
1
0
shadeEffect动态消失渲染

import QtQuick 2.0ShaderEffect { id:genieEffect anchors.centerIn: parent property variant source mesh:GridMesh{resolution: Qt.size(10,10)} propert......

蓝栩液枫
24分钟前
2
0
苦逼程序员的真实生活 

程序员这个行业虽然待遇还不错,但是不仅累,拿命去换取的,很多时候也是很苦逼的,有多少程序员还在苦苦追求心里的那个她。我就是千万程序员大军中的一员,其中有多苦逼我最清楚,以下的12张...

linux服务器架构
27分钟前
2
0
idea 创建maven 分支apply-patch中模块

1.点击idea 有上角的 project structure 2.选择modules-->点击“+”-->new module--->maven-->添加group id=com.paic.gamma.apply ,artifactid-分支名(qilu-bank),version=1.0-SNAPSHOT ......

qimh
31分钟前
2
0
企业在数字化转型,数据化运营上遇到了哪些困境,如何解决?

公司决策者意识到成功的数字体验越来越重要。调查受访者表示,这种成功的衡量标准是,用户体验和满意度提高(53%),市场敏捷性提高(49%),收入和盈利能力增加(49%),员工生产力提高(...

NBI大数据可视化
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部