2018-04-05 18:02:27 leoxyk 阅读数 1971

Unix时间戳

Unix时间戳(英文为Unix epoch, Unix time, POSIX timeUnix timestamp),是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒[1]

为什么从1970年1月1日开始?

最懒的解释UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的。

深入解释:最初计算机操作系统是32位,而时间也是用32位表示。32位能表示的最大值是2147483647。另外1年365天的总秒数是315360002147483647/31536000 = 68.1,也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为10000000 00000000 00000000 00000000,也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

所以,因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),至于时间回归的现象相信随着64位操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒

java中获取当前Unix时间戳的方法

//方法 一
System.currentTimeMillis()/1000;
//方法 二
Calendar.getInstance().getTimeInMillis()/1000;
//方法 三
new Date().getTime()/1000;

mysql获取当前Unix时间戳的方法

select unix_timestamp(now()) 

备注:

1.闰秒
科学上有两种时间计量系统:基于地球自转的天文测量而得出的"世界时"和以原子振荡周期确定的"原子时""世界时"由于地球自转的不稳定(由地球物质分布不均匀和其它星球的摄动力等引起的)会带来时间的差异,"原子时"(一种较恒定的时制,由原子钟得出)则是相对恒定不变的。这两种时间尺度速率上的差异,一般来说一至二年会差大约1秒时间。

1971年国际计量大会通过决议:使用"协调世界时"来计量时间。当"协调世界时""世界时"之差超过0.9秒时,国际地球自转服务组织(IERS)就负责对"协调世界时"拨快或拨慢1秒,这就是闰秒

协调世界时(英:Coordinated Universal Time ,法:Temps Universel Coordonné),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。

协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。


2018-12-25 11:35:43 CrayonK 阅读数 523

        unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

        UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.

        一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。

        在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。

java获取时间戳的三种方式:

        #方法一:

            System.currentTimeMillis();

        #方法二:

            Calendar.getInstance().getTimeInMillis()

        #方法三:

            new Date().getTime()

Python获取时间戳的方式:

            time.time()

mysql获取时间戳的方式:

            SELECT UNIX_TIMESTAMP(NOW())

 

2016-08-31 18:30:53 u013748736 阅读数 3063

最近在一家公司实习所做的项目后台是用php写的,同事喜欢用unix时间戳来存储时间,刚开始觉得很不直观,倒不如直接用date来存储,直观又简洁。但是有经验的人做出的决定肯定是有原因的。

什么是unix时间戳?

unix时间戳是从1970年1月1日0时0分0秒开始计算秒数的一个数值,在最近几年里,在数据库中存放的应该都是以1开头的一串11位数字,所以,刚好在mysql中以int(11)型存储。

为什么要用unix时间戳?

在现在的系统中经常遇到跨数据库的应用开发,在数据库系统中不同的数据库对与时间类型却有不同解释,比如ORACLE的date和MYSQL里面的date就不能直接兼容转换,数据方面还可以使用数据迁移工具进行转换,但是对与应用来说那就是灾难。
为了实现垮平台在应用系统中记录时间的时候我们就可以使用记录UNIX时间戳的方法做到垮平台性。现在大多数的语言java、PHP、Perl等都支持直接取UNIX时间戳,将需要记录的时间记录为UNIX时间戳,这样就可以不同的数据库系统中的垮平台性,对与时间的操作只要对时间戳操作就行了。

在mysql中将查询结果为unix时间戳转换为date格式

select from_unixtime(c_order_time)order_time,from_unixtime(c_over_time)over_time from t_student
查询结果如下:
这里写图片描述

关于from_unixtime

FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)是MySQL里的时间函数
,unix_timestamp可以是字段名,也可以直接是Unix 时间戳,format主要是将返回值格式化。
若format已经给出,则结果的格式是根据format 字符串而定。
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
根据format字符串格式化date值。
下列修饰符可以被用在format字符串中:
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

那将日期转换为unix时间戳呢?当然也有对应的函数叫UNIX_TIMESTAMP

unix_timestamp()函数的作用是返回一个确切的时间点的UNIX时间戳,这个Unix时间戳是一个无符号整数。unix_timestamp()函数有两种重载形式,一是不带任何参数,另外一个是带有一个Date或DateTime或TimeStamp类型的参数。
unix_timestamp(),返回自1970-1-1 8:00:00开始到当前系统时间为止的秒数。
unix_timestamp(date),返回1970-1-1 8:00:00开始到date所代表的时间为止的秒数,对于早于1970-1-1 8:00:00的时间,总是返回 0 。

2018-09-12 22:59:03 a158123 阅读数 9568

前言

最近在使用阿里的日志服务时,遇到了一些JavaTimestamp的坑,所以特意做了了解并整理了一下。在这之前首先得介绍一下Unix时间戳:

Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

但是Java中很多获取时间戳的API并不是获取到Unix时间戳,而是获取到*从1970年1月1日(UTC/GMT的午夜)开始所经过的毫秒数***。以毫秒计算的时间戳下面统一称为时间戳

Java中获取时间戳的API

以获取当前时间的时间戳为例,下面将展示多种获取时间戳的办法:

  1. 说到常用的类,其实日期类java.util.Date也有对应的方法:

    //初始化Date对象
    Date date=new Date();
    //获取Date对象对应的时间戳
    System.out.println(date.getTime());
    
  2. 而除了最早的日期类java.util.Date其实后续新增的java.util.Calendar也提供相应的API:

    //初始化Calendar对象
    Calendar calendar=Calendar.getInstance();
    //获取Calendar对象对应的时间戳
    System.out.println(calendar.getTimeInMillis());
    
  3. 而说到了时间戳就不得不提java.sql.Timestamp这个时间戳对应的类:

    //初始化Timestamp,需要注意构造方法的入参是一个时间戳
    Timestamp timestamp=new Timestamp(System.currentTimeMillis());
    //获取Timestamp对象对应的时间戳
    System.out.println(timestamp.getTime());
    
  4. 难道Java中就不能直接获取Unix时间戳吗?当然不是,JDK8中新增的java.time.LocalDateTime就可以直接获取到Unix时间戳:

    //初始化时区对象,北京时间是UTC+8,所以入参为8
    ZoneOffset zoneOffset=ZoneOffset.ofHours(8);
    //初始化LocalDateTime对象
    LocalDateTime localDateTime=LocalDateTime.now();
    //获取LocalDateTime对象对应时区的Unix时间戳
    System.out.println(localDateTime.toEpochSecond(zoneOffset));
    

时间戳与Unix时间戳相互转换

时间戳与Unix时间戳相互转换其实很简单。因为时间戳是以毫秒为单位,而Unix时间戳是以秒为单位,所以可以得到一个公式:Unix时间戳=时间戳/1000,即时间戳=Unix时间戳*1000。那么转化的代码也很简单:

	/**
     * 时间戳转Unix时间戳
     * @param timestamp
     * @return
     */
    public long toUnixTimeStamp(long timestamp){
        return timestamp/1000;
    }

    /**
     * Unix时间戳转时间戳
     * @param unixTimeStamp
     * @return
     */
    public long toTimestamp(long unixTimeStamp){
        return unixTimeStamp*1000;
    }
2016-11-05 16:49:37 TeckerYu 阅读数 2069

UNIX时间戳与time()算时间差

在mysql查询中我们经常会遇到UNIX时间戳的转换还有计算经过时间的问题,下面的我的一种解决方案

需要用到的函数

getdate(unix数字时间戳)

将时间戳数字转化为键值数组,使得我们可以轻易地分离想要进行判断的时间

time()

方便获取现在的时间

现假设从mysql中获取到时间戳为$result

            $date_time_array = getdate($result);
            $hour = $date_time_array['hours'];
            $min = $date_time_array['minutes'];
            $second = $date_time_array['seconds'];
            $month = $date_time_array['mon'];
            $day = $date_time_array['mday'];
            $year = $date_time_array['year'];
            $now_time_array = getdate(time());
            if($year<$now_time_array['year'])
            {
                $diff = $now_time_array['year']-$year;
                $timediff = $diff.'年前'; 
            }
            else if($month<$now_time_array['mon'])
            {
                $diff = $now_time_array['mon']-$month;
                $timediff = $diff.'月前';
            }
            else if($day<$now_time_array['mday'])
            {
                $diff = $now_time_array['mday']-$day;
                $timediff = $diff.'天前';
            }
            else if($hour<$now_time_array['hours'])
            {
                $diff = $now_time_array['hours']-$hour;
                $timediff = $diff.'小时前';
            }
            else if($min<$now_time_array['minutes'])
            {
                $diff = $now_time_array['minutes']-$min;
                $timediff = $diff.'分钟前';
            }
            else if($second<$now_time_array['seconds'])
            {
                $diff = $now_time_array['seconds']-$second;
                $timediff = $diff.'秒前';
            }

循环嵌套顺序判断年月日时分秒,找到第一个不同项相减,就能够计算出数据的距今时间

没有更多推荐了,返回首页