新普金娱乐网址


奇门遁甲

数学动用Apriori举行关联分析(一)

天文小白的Python之路 day5 time,datatime模块详解

  • 三月 09, 2019
  • 天文
  • 没有评论

在开发Android的长河中,出现过五回出于日期时间导致的题材,而且重点是出于时区的由来造成,所以直接想计算一下,形成叁个能够的开发规范。

一.模块的分类

 

能够分为三大类:

一、Unix时间戳

  1.标准库

 

  2.开源模块

  Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX
time),是一种时光代表方法,定义为从格林威治时间一九七零年0五月022216日00时00分00秒起至今后的总秒数。Unix时间戳不仅被选取在Unix系统、类Unix系统中,也在不少别的操作系统中被周边采纳。

  3.自定义模块

 

 

二.标准库模块详解

二 、关于时间标准和时区

1.time与datetime

 

在Python中,经常有那二种艺术来表示时间:1)时间戳
2)格式化的时光字符串
3)元组(struct_time)共玖个因素。由于Python的time模块完结重庆大学调用C库,所以各样平台大概截然不一样。

UTC(Coordinated Universal
提姆e,世界和谐时)亦即格林威治天文时间,世界标准时间。在炎黄为UTC+8。DST(Daylight
Saving Time)即夏令时。

 

光阴戳(timestamp)的方法:平时来说,时间戳表示的是从一九六九年八月三十日00:00:00开始按秒计算的偏移量。大家运维“type(time.time())”,重临的是float类型。重临时间戳格局的函数首要有time(),clock()等。

 

元组(struct_time)方式:struct_time元组共有八个成分,重返struct_time的函数首要有gmtime(),localtime(),strptime()。上边列出那种艺术元组中的多少个要素:

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2018
1 tm_mon(月) 1 – 12
2 tm_mday(日) 1 – 31
3 tm_hour(时) 0 – 23
4 tm_min(分) 0 – 59
5 tm_sec(秒) 0 – 61
6 tm_wday(weekday) 0 – 6(0表示周日)
7 tm_yday(一年中的第几天) 1 – 366
8 tm_isdst(是否是夏令时) 默认为-1

 

随即介绍time模块中常用的多少个函数:

1)time.localtime([secs]):将三个年华戳转换为近来时区的struct_time。secs参数未提供,则以如今时间为准。

天文 1

 

投入参数后:

 

天文 2

 

怎么样取其中的数值呢

 

天文 3

 

 

 

2)time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将3个小时戳转换为UTC时区(0时区)(跟中中原人民共和国时区相差8钟头)的struct_time。

天文 4

 

3)time.time():再次来到当前时刻的时间戳。

天文 5

 

4)time.mktime(t):将一个struct_time转化为时间戳。

 天文 6

 

 

5)time.sleep(secs):线程推迟内定的时光运作。单位为秒。
 #那一个就不多说

 

6)time.clock():那么些供给小心,在差异的种类上含义区别。在UNIX系统上,它回到的是“进度时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第1遍调用,重回的是过程运营的其实时间。而第③次之后的调用是自第①回调用未来到前几天的运转时刻。(实际上是以WIN32上QueryPerformanceCounter()为底蕴,它比纳秒表示进一步准确)

 

 

import time 
if __name__ == ‘__main__’: 
    time.sleep(1) 
    print “clock1:%s” % time.clock() 
    time.sleep(1) 
    print “clock2:%s” % time.clock() 
    time.sleep(1) 
    print “clock3:%s” % time.clock()

 

运维结果:

clock1:3.35238137808e-006
clock2:1.00004944763
clock3:2.00012040636

中间第6个clock()输出的是程序运维时间

第3 、四个clock()输出的都以与第一个clock的年月距离

7)time.asctime([t]):把贰个象征时间的元组或然struct_time代表为那种格局:’Sun
Jun 20 23:21:05
一九九二’。要是没有参数,将会将time.localtime()作为参数传入。

天文 7

8)time.ctime([secs]):把叁个时刻戳(按秒总括的浮点数)转化为time.asctime()的款式。假设参数未给依然为None的时候,将会暗中同意time.time()为参数。它的法力也正是time.asctime(time.localtime(secs))。

天文 8

 

9)time.strftime(format[,
t]):把3个代表时间的元组或然struct_time(如由time.localtime()和time.gmtime()重临)转化为格式化的小时字符串。要是t未钦点,将盛传time.localtime()。倘若元组中任何1个元素越界,ValueError的荒唐将会被抛出。

 

 

格式 含义 备注
%a 本地(locale)简化星期名称  
%A 本地完整星期名称  
%b 本地简化月份名称  
%B 本地完整月份名称  
%c 本地相应的日期和时间表示  
%d 一个月中的第几天(01 – 31)  
%H 一天中的第几个小时(24小时制,00 – 23)  
%I 第几个小时(12小时制,01 – 12)  
%j 一年中的第几天(001 – 366)  
%m 月份(01 – 12)  
%M 分钟数(00 – 59)  
%p 本地am或者pm的相应符
%S 秒(01 – 61)
%U 一年中的星期数。(00 – 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w 一个星期中的第几天(0 – 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。  
%x 本地相应日期  
%X 本地相应时间  
%y 去掉世纪的年份(00 – 99)  
%Y 完整的年份  
%Z 时区的名字(如果不存在为空字符)  
%% ‘%’字符  

 

备注:

天文 9

 

“%p”只有与“%I”合作使用才有机能。
文书档案中强调确实是0 – 61,而不是59,闰年秒占两秒(汗二个)。
当使用strptime()函数时,唯有当在那年中的周数和平运动气被鲜明的时候%U和%W才会被计算。
举个例子:

>>> time.strftime(“%Y-%m-%d %X”, time.localtime())
天文 10

10)time.strptime(string[,
format]):把3个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

>>> time.strptime(‘2018-01-08 21:07:06’, ‘%Y-%m-%d %X’)

strftime(“格式”,struct_time)
—–>”格式化的字符串”

strptime(“格式化的字符串”,”格式”)—–>struct_time

 

在这么些函数中,format暗许为:”%a %b %d %H:%M:%S %Y”。

 

末段,大家来对time模块进行三个计算。依照从前描述,在Python中国共产党有三种表明情势:1)timestamp
2)tuple只怕struct_time 3)格式化字符串。

它们之间的转折如图所示:

天文 11

 

 

三.datetime 模块的某些用法

 

 

 天文 12

 

  1、原子时:International Atomic Time (IAT)

 

    又称国际原狗时,是一种通过原子钟得到的时刻标准,原子钟是社会风气上已知最可信的时日度量和频率标准,原子钟在
37 亿年的误差不超越 1 秒。

 

  2、世界时:Universal Time(UT)

 

    是一种以格林尼治子夜起算的平太阳时。世界时是以地球自转为基准获得的时间尺度,其精度受到地球自转不均匀变化和极移的影响,为了消除那种影响,壹玖伍叁年国际天文学画家联合会师会概念了UT0、UT1和UT2多少个种类,他们三者之间是促进的关系,后者都以发现前者的局地心地差异,通过改良获得更均匀的时标。

 

    在Green尼治子午线上的平太阳时名为世界时(UT0),又叫格林尼治平常(GMT)。Green尼治标准时间(旧译格林尼治平均时间或格林威治标准时间,斯洛伐克语:格林wich
Mean
Time,GMT)是指位于大不列颠及英格兰联合王国London三山区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。自一九二三年三月11日初叶,格林尼治天文台每隔一钟头会向中外发放调时音信。

 

  二 、协调世界时:Coordinated Universal Time(UTC)

 

    又称世界标准时间、世界统近日间。是透过平分太阳时(以Green威治时间GMT为准)、地轴运动修正后的新时标以及以“秒”为单位的国际原卯时所回顾计算而成的时刻,总结进度分外严俊精密,由此若以“世界标准时间”的角度来说,UTC比GMT更精准。其误差值必须维持在0.9秒之内,若超过0.9秒则由位于法国首都的国际地球自转事务中心局公布闰秒,使UTC与地球自转周期一致。

 

    基本上UTC的原形强调的是比GMT更可信的世界时间标准,UTC中多三个闰秒的调整,以有限支撑协调世界时(UTC)与格林尼治平时(GMT)相差不会超过0.9秒,并在有亟待的时候在协调世界时(UTC)内添加正或负闰秒。

 

    UTC被选择在大部分的处理器以及互连网正式中。

 

  ③ 、夏令时与冬令时:Daylight Saving Time(DST)

 

    又称“日光节约时制”和“夏令时间”,是一种为节能而人工规定地方时间的制度,在这一制度实践时期所采取的联结时间称为“夏令时间”。一般在天亮早的夏季人工将时刻提前一时辰,能够使人早起早睡,收缩照明量,以丰裕利用光照能源,从而节省照明用电。各种采用夏时制的国度现实规定不一样。目后天下有近111个国家每年要履行夏令时。自二〇一二年3月2七日开端俄罗斯永恒使用夏令时,把日子拨快一小时,不再调回。

 

    简单来讲,使用夏令时和冬令时即在夏日将时间拨快2个时辰,等到冬日再将时刻拨慢叁个钟头。

 

  4、CST

 

    CST同时意味着澳洲、U.S.A.、中夏族民共和国、古巴两国的标准时间,时区分别为:

 

     澳大阿伯丁中段时间,Central Standard Time (Australia) UT+9:30

     中部标准时区(澳洲),Central Standard Time (North America)
UT-6:00

     香水之都时间,China Standard Time UT+8:00

     古巴规范时间,Cuba Standard Time UT-4:00

 

  在支付时我们供给专注区别国度的时区,并且UTC和GMT在总括机系列中使用并无明显差别,可身为等同。

 

二、规范

 

  在实质上花费中,当岁月用来展现时,非特殊须求下一般选拔系统暗中认可的时区时间作为呈现时间。将时间做为数据存款和储蓄或传递给任何系统时(尤其是跨平台调用),则最好利用专业的UTC/GMT时间(前边统称GMT),除非事先约定或标识了时光的花色。

 

叁 、在Android中须求越发注意的事项

 

  一 、Android中意味着日期时间的品种,有Date、Calendar,他们在没有出示设置其时区时,取到的当前几天子均为系统默许时区的年华,就算给定1个时刻,同样是按系统暗中同意时区来换算时间,所以说他俩皆以与时区相关的。

 

  贰 、SimpleDateFormat对象自小编也是跟时区相关。

 

    当使用parse将1个字符串格式的日子转换为Date对象,可能将3个Date对象转换为字符串日期时,那么些字符串日期的时区以SimpleDateFormat关联的时区为准,如果经过setTimeZone修改了时区,则那几个字符串日期以修改后的时区为准。例如:

 

// 2013-1-31 22:17:14

Date date = new Date(1359641834000L);

System.out.println(date);

String dateStr = “2013-1-31 22:17:14”;

SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd
HH:mm:ss”);

dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT”));

try

{

    //
对于早已设定为GMT时间标准的dateFormat来说,一切须要他转移的字符串日期都以GMT标准时间,转换后赶回的Date由于暗许坚守系统暗中同意时区,所以转换给Date的日期供给+8(例如法国首都标准时区),也等于时区与行业内部不一造成的时差。

    Date dateTmp = dateFormat.parse(dateStr);

    System.out.println(dateTmp);

catch (ParseException e) 

{

    e.printStackTrace();  

}  

// Date依然按系统私下认可时区,而format格式化处来的字符串是GMT,所以要-8。

String dateStrTmp = dateFormat.format(date);  

System.out.println(dateStrTmp);

    输出结果为:image

  叁 、Calendar在不手动设置时区时,是与系统默许时区相关的。在手动修改时区后,不可能选择calendar.getTime方法来间接获得Date日期,因为那时候的日子与setTime时的值相同,想要正确获取修改时区后的小运,应该通过calendar的get方法。例如:

 

Date date = new Date(1359641834000L);

System.out.println(date);

Calendar calendar = Calendar.getInstance();

calendar.setTimeZone(TimeZone.getTimeZone(“GMT”));  

// 大概能够 Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone(“GMT”));  

calendar.setTime(date);

System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + “:” +
calendar.get(Calendar.MINUTE));

 

Calendar calendar2 = Calendar.getInstance();  

calendar2.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND));

 

System.out.println(calendar.getTime());  

System.out.println(calendar2.getTime());

    输入结果为:image

 

  4、TimeZone

 

    在付出中,我们能够经过TimeZone对象获得有关系统私下认可时区及其相关的详细音讯。

 

四 、Android关于日期的工具类

 

/**

 * Copyright (C) 2011, BHJ

 * All rights reserved.

 * 

 * 文件名称:

 * 文件标识:

 * 文件摘要:

 * 

 * 当前版本:

 * 作    者:

 * 完毕日期:2012-12-20

 * 

 * 取代版本:

 * 修改时间:

 * 修 改 人:

 * 修改摘要:

 */

 

package com.bhj.timetest;

 

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.TimeZone;

 

/**

 * 日期工具类(未尤其说明的均为系统暗中认可时区下的光阴)

 * */

public class DateUtil

{    

    /** 1s==1000ms */

    private final static int TIME_MILLISECONDS = 1000;

    /** 时间中的分、秒最大值均为60 */

    private final static int TIME_NUMBERS = 60;

    /** 时间中的小时最大值 */

    private final static int TIME_HOURSES = 24;

    /** 格式化日期的行业内部字符串 */

    private final static String FORMAT = “yyyy-MM-dd HH:mm:ss”;

    

    /**

     * 获取时区音信

     * */

    public static TimeZone getTimeZone()

    {

        return TimeZone.getDefault();

    }

    

    /**

     * 将日期字符串转换为Date对象

     * @param date 日期字符串,必须为”yyyy-MM-dd HH:mm:ss”

     * @return 日期字符串的Date对象表达情势

     * */

    public static Date parseDate(String date)

    {

        return parseDate(date, FORMAT);

    }

    

    /**

     * 将日期字符串转换为Date对象

     * @param date 日期字符串,必须为”yyyy-MM-dd HH:mm:ss”

     * @param format 格式化字符串

     * @return 日期字符串的Date对象表明格局

     * */

    public static Date parseDate(String date, String format)

    {

        Date dt = null;

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        try

        {

            dt = dateFormat.parse(date);

        }

        catch(ParseException e)

        {

            e.printStackTrace();

        }

        

        return dt;

    }

    

    /**

     * 将Date对象转换为钦点格式的字符串

     * @param date Date对象

     * @return Date对象的字符串表明方式”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatDate(Date date)

    {

        return formatDate(date, FORMAT);  

    }

    

    /**

     * 将Date对象转换为钦命格式的字符串

     * @param date Date对象

     * @param String format 格式化字符串

     * @return Date对象的字符串表明格局

     * */

    public static String formatDate(Date date, String format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);  

        return dateFormat.format(date);  

    }

 

    /**

     * 格式化日期

     * @param long unixTime unix时间戳

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatUnixTime(long unixTime)

    {  

        return formatUnixTime(unixTime, FORMAT);

    }

    

    /**

     * 格式化日期

     * @param long unixTime unix时间戳

     * @param String format 格式化字符串

     * @return 日期字符串

     * */

    public static String formatUnixTime(long unixTime, String format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);  

        return dateFormat.format(unixTime);  

    }

    

    /**

     * 将GMT日期格式化为系统默许时区的日期字符串表明情势

     * @param gmtUnixTime GTM时间戳

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatGMTUnixTime(long gmtUnixTime)

    {

        return formatGMTUnixTime(gmtUnixTime, FORMAT); 

    }

    

    /**

     * 将GMT日期格式化为系统默许时区的日子字符串表明方式

     * @param gmtUnixTime GTM时间戳

     * @param format 格式化字符串

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatGMTUnixTime(long gmtUnixTime, String
format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        return dateFormat.format(gmtUnixTime +
TimeZone.getDefault().getRawOffset()); 

    }

    

    /**

     * 获取时间戳的Date表示情势

     * @param unixTime unix时间戳

     * @return Date对象

     * */

    public static Date getDate(long unixTime)

    {  

        return new Date(unixTime);  

    }

    

    /**

     *
获取GMT时间戳的Date表示情势(转换为Date表示方式后,为系统暗中同意时区下的年月)

     * @param gmtUnixTime GMT Unix时间戳

     * @return Date对象

     * */

    public static Date getGMTDate(long gmtUnixTime)

    {

        return new Date(gmtUnixTime +
TimeZone.getDefault().getRawOffset()); 

    }

 

    /**

     * 将系统暗许时区的Unix时间戳转换为GMT Unix时间戳

     * @param unixTime unix时间戳

     * @return GMT Unix时间戳

     * */

    public static long getGMTUnixTime(long unixTime)

    {

        return unixTime – TimeZone.getDefault().getRawOffset();

    }

 

    /**

     * 将GMT Unix时间戳转换为系统暗许时区的Unix时间戳

     * @param gmtUnixTime GMT Unix时间戳

     * @return 系统暗中认可时区的Unix时间戳

     * */

    public static long getCurrentTimeZoneUnixTime(long gmtUnixTime)

    {

        return gmtUnixTime + TimeZone.getDefault().getRawOffset();

    }

    

    /**

     * 获取当前光阴的GMT Unix时间戳

     * @return 当前的GMT Unix时间戳

     * */

    public static long getGMTUnixTimeByCalendar()

    {

        Calendar calendar = Calendar.getInstance();

        // 获取当前时区下日期时间对应的时辰戳

        long unixTime = calendar.getTimeInMillis();

        // 获取标准格林尼治时间下日期时间对应的时日戳 

        long unixTimeGMT = unixTime –
TimeZone.getDefault().getRawOffset();

        return unixTimeGMT;

    }

    

    /**

     * 获取当前岁月的Unix时间戳

     * @return 当前的Unix时间戳

     * */

    public static long getUnixTimeByCalendar()

    {

        Calendar calendar = Calendar.getInstance();

        // 获取当前时区下日期时间对应的小运戳

        long unixTime = calendar.getTimeInMillis();

        return unixTime;

    }

    

    /** 

     * 获取更改时区后的岁月 

     * @param date 时间 

     * @param oldZone 旧时区 

     * @param newZone 新时区 

     * @return 时间

     */  

    public static Date changeTimeZone(Date date, TimeZone oldZone,
TimeZone newZone) 

    {  

        Date dateTmp = null;

        if (date != null)

        {

            int timeOffset = oldZone.getRawOffset() –
newZone.getRawOffset();

            dateTmp = new Date(date.getTime() – timeOffset);

        }

        return dateTmp;

    }

    

    /**

     * 将总秒数转换为时分秒表达形式

     * @param seconds 任意秒数

     * @return %s小时%s分%s秒

     */

    public static String formatTime(long seconds)

    {

        long hh = seconds / TIME_NUMBERS / TIME_NUMBERS;

        long mm = (seconds – hh * TIME_NUMBERS * TIME_NUMBERS) >
0 ? (seconds – hh * TIME_NUMBERS * TIME_NUMBERS) / TIME_NUMBERS :
0;

        long ss = seconds < TIME_NUMBERS ? seconds : seconds %
TIME_NUMBERS;

        return     (hh == 0 ? “” : (hh < 10 ? “0” + hh : hh) +
“小时”) 

                + (mm == 0 ? “” : (mm < 10 ? “0” + mm : mm) + “分”) 

                + (ss == 0 ? “” : (ss < 10 ? “0” + ss : ss) + “秒”);

    }

    

    /**

     * 获取当前光阴距离钦命日期时差的大约表明方式

     * @param long date 日期

     * @return 时差的差不多表达方式

     * */

    public static String getDiffTime(long date)

    {

        String strTime = “很久很久在此以前”;

        long time = Math.abs(new Date().getTime() – date);

        // 一分钟之内

        if(time < TIME_NUMBERS * TIME_MILLISECONDS)

        {

            strTime = “刚刚”;

        }

        else

        {

            int min = (int)(time / TIME_MILLISECONDS / TIME_NUMBERS);

            if(min < TIME_NUMBERS)

            {

                if(min < 15)

                {

                    strTime = “一小时前”;

                }

                else if(min < 30)

                {

                    strTime = “半时辰前”;

                }

                else

                {

                    strTime = “1小时前”;

                }

            }

            else

            {

                int hh = min / TIME_NUMBERS;

                if(hh < TIME_HOURSES)

                {

                    strTime = hh + “小时前”;

                }

                else

                {

                    int days = hh / TIME_HOURSES;

                    if(days <= 6)

                    {

                        strTime = days + “天前”;

                    }

                    else

                    {

                        int weeks = days / 7;

                        if(weeks < 3)

                        {

                            strTime = weeks + “周前”;    

                        }

                    }

                }

            }

        }

        

        return strTime;

    }

}

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图