在mysql datetime和python timestamp之间转换的正确方法是什么?

时间:2013-01-12 08:24:41

标签: mysql python-3.x

根据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'))

2 个答案:

答案 0 :(得分:40)

如果我没有正确理解,请尽快更新,但这里有一些可能有用的例子。请注意,这会使用datetime模块而不是time

>>> import datetime

我们在此设置了一个示例时间戳ts和一种格式f

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

与您上面所做的类似,我们使用strptime函数(来自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'

答案 1 :(得分:0)

我只是添加此类,以可能节省下一个家伙一点时间。如果有人觉得这有用,请提高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()