题外话,祝各位程序猿们中秋佳节快乐~~~O(∩_∩)O~。 ##追本溯源 ###历史html
####GMT 百度百科:格林威治时间 ####UTC 百度百科:协调世界时java
二者比较:mysql
GMT:最初确立的世界标准时间,名字由来是由于英国的皇家格林尼治天文台而得名,由于本初子午线被定义在经过那里的经线。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。因为地球天天的自转是有些不规则的,并且正在缓慢减速,所以,格林尼治时间已经再也不被做为标准时间使用。新的标准时间,是由原子钟报时的协调世界时(UTC)。--百度百科linux
UTC:是目前使用的世界标准时间,其以原子时秒长为基础,在时刻上尽可能接近于格林尼治平时。国际原子时的偏差为每日数纳秒,而世界时的偏差为每日数毫秒。对于这种状况,一种称为协调世界时的折衷时标于1972年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有须要的状况下会在协调世界时内加上正或负闰秒。所以协调世界时与国际原子时之间会出现若干整数秒的差异。位于巴黎的国际地球自转事务中央局负责决定什么时候加入闰秒。 --维基百科sql
这里要提下有趣的事情是,由于UTC闰秒的缘故,java中的秒可能为60或61,但java文档中有说这个是依据计算机的环境,没法保证准确性囧。 根据这两个比较,GMT和UTC在正常生活中能够指同一个时间,除非你作的东西对时间的准确性极为敏感。数据库
###一些重要概念: ####时区 1884年国际经线会议规定,全球按经度分为24个时区,每区各占经度15°。 以本初子午线为中央经线的时区为零时区,由零时区向东、西各分12区,东、西12区都是半时区,共同使用180°经线的地方时。编程
####CST :China Standard Time UTC+8:00 中国标准时间(北京时间),在东八区 俺们这块的时区就是 UTC +8 ,至关于咱们国家的使用的时间比世界协调时间快了8小时。api
####unix时间戳 是从1970年1月1日(UTC/GMT的午夜)开始所通过的秒数,不考虑闰秒。 这里在放一个连接,关于为何都要从1970年算起,之前也真是懒的思考这个问题,拿来就用,之后真的须要作什么事情都先问个为何了。O(∩_∩)O哈哈~ 计算机时间、unix时间、linux时间、java时间为什么以1970年1月1日为原点?从1970年1月1日开始计算? 百度百科:unix时间戳网络
##java中使用 ###时间类 timeStamp date Calendarui
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
类,用来把时间格式化显示的,显示的样式很丰富,看下列表格列举的。
Letter | Date or Time Component | Presentation | Examples |
---|---|---|---|
G | Era designator | Text | AD |
y | Year | Year | 1996; 96 |
M | Month in year | Month | July; Jul; 07 |
w | Week in year | Number | 27 |
W | Week in month | Number | 2 |
D | Day in year | Number | 189 |
d | Day in month | Number | 10 |
F | Day of week in month | Number | 2 |
E | Day in week | Text | Tuesday; Tue |
a | Am/pm marker | Text | PM |
H | Hour in day (0-23) | Number | 0 |
k | Hour in day (1-24) | Number | 24 |
K | Hour in am/pm (0-11) | Number | 0 |
h | Hour in am/pm (1-12) | Number | 12 |
m | Minute in hour | Number | 30 |
s | Second in minute | Number | 55 |
S | Millisecond | Number | 978 |
z | Time zone | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | Time zone | RFC 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个字节。
区别:
datetime
和timestamp
之间最大的不一样就是在于,timestamp随着时区的变化而变化,默认会根据系统的时区设置来存储时间,打个比方,若是你在东八区存储一个时间,以后把数据库系统设置另外一个时区则取出来的值发生变化。若是你存储数据的库分布在不一样的时区时你就要考虑这种状况,而采用datetime
,由于它是不受时区影响的。timestamp
提供了每次数据更新时,自动更新为现有的时间功能,这个功能比较有用。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时间戳