python怎么获取当前时间并计算_如何从python计算当前月份时间。时间()

下面介绍了如何在不使用任何库函数的情况下将Unix epoch时间转换为(UTC)Gregorian日期。下面的代码只导入time,以验证计算的日期是否与time.gmtime返回的日期相同。在

请注意,在2038年1月19日(星期二)UTC 03:14:08,32位版本的Unix时间戳将停止工作,因为它将溢出32位数字中可以保存的最大值。因此,在32位系统上,不要尝试调用time.gmtime来获取此类时间戳。当然,下面使用的算法不受这些限制。在#!/usr/bin/env python

''' Convert Unix Epoch seconds to (proleptic) Gregorian date

Algorithm by E. G. Richards, https://en.wikipedia.org/wiki/Julian_day

See http://stackoverflow.com/q/35796786/4014959

Python implementation by PM 2Ring 2016.03.07

'''

from time import gmtime

def epoch_seconds_to_gregorian_date(eseconds):

# Algorithm parameters for Gregorian calendar

y = 4716; j = 1401; m = 2; n = 12; r = 4; p = 1461

v = 3; u = 5; s = 153; w = 2; B = 274277; C = -38

#Julian day, rounded

J = int(0.5 + eseconds / 86400.0 + 2440587.5)

f = J + j + (((4 * J + B) // 146097) * 3) // 4 + C

e = r * f + v

g = (e % p) // r

h = u * g + w

D = (h % s) // u + 1

M = (h // s + m) % n + 1

Y = (e // p) - y + (n + m - M) // n

return Y, M, D

# Tests

def test(s):

t = gmtime(s)

gmdate = t.tm_year, t.tm_mon, t.tm_mday

e2gdate = epoch_seconds_to_gregorian_date(s)

assert gmdate == e2gdate, (t, gmdate, e2gdate)

return '%d.%d.%d' % e2gdate

print 'hours'

for i in xrange(25):

s = 3600 * i

print i, test(s)

print '\ndays'

for i in xrange(32):

s = 86400 * i

print i, test(s)

print '\n2 days by seconds...'

for s in xrange(86400 * 2):

test(s)

n = 50

print '\n%d years by days...' % n

for i in xrange(365 * n):

s = 86400 * i

test(s)

print 'Ok'

输出

^{pr2}$

这是一个改进的版本,它还返回小时、分钟和秒。这段代码处理分数秒,但是time.struct_time的字段都是整数,因此我的test函数不能与分数秒一起使用。在#!/usr/bin/env python

''' Convert Unix Epoch seconds to (proleptic) Gregorian date

Algorithm by E. G. Richards, https://en.wikipedia.org/wiki/Julian_day

See http://stackoverflow.com/q/35796786/4014959

Python implementation by PM 2Ring 2016.03.07

'''

from time import time, gmtime

from random import randint

import sys

def epoch_seconds_to_gregorian_date(eseconds):

# Algorithm parameters for Gregorian calendar

y = 4716; j = 1401; m = 2; n = 12; r = 4; p = 1461

v = 3; u = 5; s = 153; w = 2; B = 274277; C = -38

#Julian day, rounded

J = int(0.5 + eseconds / 86400.0 + 2440587.5)

#Date calculation

f = J + j + (((4 * J + B) // 146097) * 3) // 4 + C

e = r * f + v

g = (e % p) // r

h = u * g + w

D = (h % s) // u + 1

M = (h // s + m) % n + 1

Y = (e // p) - y + (n + m - M) // n

#Time calculation

seconds = eseconds % 86400

t = int(seconds)

hr, t = divmod(t, 3600)

mn = t // 60

seconds -= 3600 * hr + 60 * mn

return Y, M, D, hr, mn, seconds

# Tests

def test(s):

t = gmtime(s)

gmdate = t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec

e2gdate = epoch_seconds_to_gregorian_date(s)

assert gmdate == e2gdate, (s, gmdate, e2gdate)

return '%d.%02d.%02d %02d:%02d:%06.3f' % e2gdate

print 'now'

s = time()

print s, epoch_seconds_to_gregorian_date(s), gmtime(s)

print '\nhours'

for i in xrange(25):

s = 3600 * i

print i, test(s)

print '\ndays'

for i in xrange(32):

s = 86400 * i

print i, test(s)

print '\n2 days by seconds...'

for i in xrange(86400 * 2):

test(i)

if i % 10000 == 0:

sys.stderr.write('.')

sys.stderr.write('\n')

n = 50

print '\n%d years by days...' % n

for i in xrange(365 * n):

s = 86400 * i

test(s)

n = 500000

print '\nRandom seconds'

for i in xrange(n):

s = randint(0, 2147483647)

test(s)

if i % 10000 == 0:

sys.stderr.write('.')

sys.stderr.write('\n')

print 'Ok'

输出now

1457355412.48 (2016, 3, 7, 12, 56, 52.476011991500854) time.struct_time(tm_year=2016, tm_mon=3, tm_mday=7, tm_hour=12, tm_min=56, tm_sec=52, tm_wday=0, tm_yday=67, tm_isdst=0)

hours

0 1970.01.01 00:00:00.000

1 1970.01.01 01:00:00.000

2 1970.01.01 02:00:00.000

3 1970.01.01 03:00:00.000

4 1970.01.01 04:00:00.000

5 1970.01.01 05:00:00.000

6 1970.01.01 06:00:00.000

7 1970.01.01 07:00:00.000

8 1970.01.01 08:00:00.000

9 1970.01.01 09:00:00.000

10 1970.01.01 10:00:00.000

11 1970.01.01 11:00:00.000

12 1970.01.01 12:00:00.000

13 1970.01.01 13:00:00.000

14 1970.01.01 14:00:00.000

15 1970.01.01 15:00:00.000

16 1970.01.01 16:00:00.000

17 1970.01.01 17:00:00.000

18 1970.01.01 18:00:00.000

19 1970.01.01 19:00:00.000

20 1970.01.01 20:00:00.000

21 1970.01.01 21:00:00.000

22 1970.01.01 22:00:00.000

23 1970.01.01 23:00:00.000

24 1970.01.02 00:00:00.000

days

0 1970.01.01 00:00:00.000

1 1970.01.02 00:00:00.000

2 1970.01.03 00:00:00.000

3 1970.01.04 00:00:00.000

4 1970.01.05 00:00:00.000

5 1970.01.06 00:00:00.000

6 1970.01.07 00:00:00.000

7 1970.01.08 00:00:00.000

8 1970.01.09 00:00:00.000

9 1970.01.10 00:00:00.000

10 1970.01.11 00:00:00.000

11 1970.01.12 00:00:00.000

12 1970.01.13 00:00:00.000

13 1970.01.14 00:00:00.000

14 1970.01.15 00:00:00.000

15 1970.01.16 00:00:00.000

16 1970.01.17 00:00:00.000

17 1970.01.18 00:00:00.000

18 1970.01.19 00:00:00.000

19 1970.01.20 00:00:00.000

20 1970.01.21 00:00:00.000

21 1970.01.22 00:00:00.000

22 1970.01.23 00:00:00.000

23 1970.01.24 00:00:00.000

24 1970.01.25 00:00:00.000

25 1970.01.26 00:00:00.000

26 1970.01.27 00:00:00.000

27 1970.01.28 00:00:00.000

28 1970.01.29 00:00:00.000

29 1970.01.30 00:00:00.000

30 1970.01.31 00:00:00.000

31 1970.02.01 00:00:00.000

2 days by seconds...

..................

50 years by days...

Random seconds

..................................................

Ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值