40

根据http://dev.mysql.com/doc/refman/5.0/en/datetime.html。我必须找到一种将字符串值 'YYYY-MM-DD HH:MM:SS' 转换为时间戳 int 的方法。

我在python的文档中查找。

我试过:

print(time.strptime('2013-01-12 15:27:43', '%Y-%m-%d %H:%M:%S'))   

python给我这样的结果。

time.struct_time(tm_year=2013, tm_mon=1, tm_mday=12, tm_hour=15, tm_min=27, tm_sec=43, tm_wday=5, tm_yday=12, tm_isdst=-1)

我尝试将时间戳转换为 YYYY-MM-DD HH:MM:SS 格式

print(time.strftime('%Y-%m-%d %H:%M:%S',time.time()))

python给我一个类型错误。

我只使用时间戳来计算时间和日期,我希望python中已经有一种方法,简单高效,并且不必创建临时数据。

根据答案我写了两种方法。希望它会有所帮助

import time

def convertTimestampToSQLDateTime(value):
    return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(value))

def convertSQLDateTimeToTimestamp(value):
    return time.mktime(time.strptime(value, '%Y-%m-%d %H:%M:%S'))
4

2 回答 2

58

如果我没有正确理解,很高兴更新此内容,但这里有一些示例可能会有所帮助。请注意,这使用datetime模块而不是time.

>>> import datetime

在这里,我们设置了一个示例时间戳ts和格式f

>>> ts = '2013-01-12 15:27:43'
>>> f = '%Y-%m-%d %H:%M:%S'

与您在上面所做的类似,我们使用strptime函数 (from datetime.datetime) 将我们的字符串转换为datetime基于格式化参数的对象:

>>> datetime.datetime.strptime(ts, f)
datetime.datetime(2013, 1, 12, 15, 27, 43)

现在反过来 - 这里我们datetime.datetime.now()用来获取当前时间作为一个datetime对象:

>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 1, 12, 0, 46, 54, 490219)

在这种datetime情况下,该strftime方法实际上是在datetime对象本身上调用的,格式参数作为参数:

>>> now.strftime(f)   
'2013-01-12 00:46:54'

在您的情况下,您收到错误的原因是因为time.time()返回一个浮点数:

>>> time.time()
1357980846.290231

time.strftime需要一个time元组,类似于你上面的。无需进入令人抓狂的时间漩涡,诸如time.localtime()返回上述time元组之类的函数将按您的预期返回:

>>> now = time.localtime()
>>> now
time.struct_time(tm_year=2013, tm_mon=1, tm_mday=12, tm_hour=0, tm_min=55, tm_sec=55, tm_wday=5, tm_yday=12, tm_isdst=0)
>>> f = '%Y-%m-%d %H:%M:%S'
>>> time.strftime(f, now)
'2013-01-12 00:55:55'
于 2013-01-12T08:57:07.507 回答
4

我只是添加这个类来潜在地为下一个人节省一点时间。如果有人觉得这很有用,请支持 RocketDonkey 的答案。

## dev on v3.7.6

from datetime import datetime
from time import mktime, time


class Time:
    '''\
*Convenience class for easy format conversion*\n
Accepts time() float, datetime object, or SQL datetime str.\n
If no time arg is provided, object is initialized with time().\n
id kwarg can be used to keep track of objects.\n
Access formats as instance.t, instance.dt, or instance.sql.\
    '''

    f = '%Y-%m-%d %H:%M:%S'

    def __init__(self, *arg, id=None) -> None:
        self.id = id
        if len(arg) == 0:
            self.t = time()
            self.dt = self._dt
            self.sql = self._sql
        else:
            arg = arg[0]
            if isinstance(arg, float) or arg == None:
                if isinstance(arg, float):
                    self.t = arg
                else:
                    self.t = time()
                self.dt = self._dt
                self.sql = self._sql
            elif isinstance(arg, datetime):
                self.t = arg.timestamp()
                self.dt = arg
                self.sql = self._sql
            elif isinstance(arg, str):
                self.sql = arg
                if '.' not in arg:
                    self.dt = datetime.strptime(self.sql, Time.f)
                else:
                    normal, fract = arg.split('.')
                    py_t = datetime.strptime(normal, Time.f)
                    self.dt = py_t.replace(
                        microsecond=int(fract.ljust(6, '0')[:6]))
                self.t = self.dt.timestamp()

    @property
    def _dt(self) -> datetime:
        return datetime.fromtimestamp(self.t)

    @property
    def _sql(self) -> str:
        t = self.dt
        std = t.strftime(Time.f)
        fract = f'.{str(round(t.microsecond, -3))[:3]}'
        return std + fract

    def __str__(self) -> str:
        if self.id == None:
            return self.sql
        else:
            return f'Time obj "{self.id}": {self.sql}'


def test():
    def test_one(*arg):
        t = Time(*arg, id=type(*arg))
        print(t)
        print(t.t)
        print(t.dt)

    sql = '2020-01-22 15:30:33.433'
    time_float = 1579927395.3708763
    dt_obj = datetime.now()
    for datum in [sql, time_float, dt_obj, None]:
        test_one(datum)


if __name__ == '__main__':
    test()
于 2020-01-25T05:26:56.290 回答