Python中日期时间格式问题

1 投票
3 回答
3527 浏览
提问于 2025-04-16 11:05

我在处理日期格式时遇到了问题。这是我的代码:

myDate=datetime.datetime.now()
print myDate #2011-02-02 13:54:26.162000
stime = time.mktime(time.strptime(myDate, '%Y-%m-%d %I:%M%S.%f'))

在我的最后一行代码中出现了异常:

File "c:\Python27\Lib\_strptime.py", line 322, in _strptime
  found = format_regex.match(data_string)

这到底是怎么回事呢?

编辑 为了更清楚,这就是我整个代码,里面混合了我在StackOverflow上找到的内容:

import random
import time

def strTimeProp(start, end, format, prop):
    """Get a time at a proportion of a range of two formatted times.

    start and end should be strings specifying times formated in the
    given format (strftime-style), giving an interval [start, end].
    prop specifies how a proportion of the interval to be taken after
    start.  The returned time will be in the specified format.
    """

    stime = time.mktime(time.strptime(start, format))
    etime = time.mktime(time.strptime(end, format))

    ptime = stime + prop * (etime - stime)

    return time.strftime(format, time.localtime(ptime))


def randomDate(start, end, prop):
    return strTimeProp(start, end, '%Y-%m-%d %H:%M:%S.%f', prop)

b1=datetime.datetime.now()
print b1
startDate=b1-datetime.timedelta(27375)
print startDate
endDate=b1-datetime.timedelta(6571)
print endDate
randomDate=randomDate(str(startDate), str(endDate), random.random())

我正在尝试生成一个成年人的随机出生日期。

我使用的是Windows XP系统。

3 个回答

0

在使用 time.strptime() 的时候,第一个参数需要是一个字符串,而不是你从 datetime.datetime.now() 得到的 datetime 对象。

把你最后一行改成:

stime = time.mktime(time.strptime(str(myDate), '%Y-%m-%d %H:%M:%S.%f'))

(不过你在编辑的代码中确实把 datetime 对象转换成了字符串)

3

确实,你会遇到OverflowError这个错误,因为你超出了Unix时间戳的范围。一个简单的解决办法是把你的代码改写一下,使用datetime和timedelta这两个对象,这样在处理日期范围时就不会有问题了。我自己也做过这样的改写,效果不错(注意,我没有考虑时区的细节)。

from datetime import datetime, timedelta
import random

def strTimeProp(start, end, format, prop):
    """Get a time at a proportion of a range of two formatted times.

    start and end should be strings specifying times formated in the
    given format (strftime-style), giving an interval [start, end].
    prop specifies how a proportion of the interval to be taken after
    start.  The returned time will be in the specified format.
    """

    sdatetime = datetime.strptime(start, format)
    edatetime = datetime.strptime(end, format)

    # get time delta and calculate new delta in days * prop
    delta = edatetime - sdatetime # this is a timedelta
    propdelta = timedelta(days = prop * delta.days)

    pdatetime = sdatetime + propdelta
    return pdatetime.strftime(format)


def randomDate(start, end, prop):
    return strTimeProp(start, end, '%Y-%m-%d %H:%M:%S.%f', prop)

b1=datetime.now()
print b1
startDate=b1-timedelta(27375)
print startDate
endDate=b1-timedelta(6571)
print endDate
randomDate=randomDate(str(startDate), str(endDate), random.random())
print randomDate

希望这能帮到你。

4

我想为成年人生成一个随机的出生日期。

好的,如果我们说成年人可以在18岁到75岁之间(6571到27375天),那么我们就来找一个距离今天这么多天之前的日期:

from datetime import datetime, timedelta
import random

birthday = datetime.today() - timedelta(days = random.randrange(6571, 27375))

print 'Person was born on %s' % (birthday.strftime('%Y-%m-%d'))    

撰写回答