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

问题描述 投票:29回答:2

根据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'))
mysql python-3.x
2个回答
43
投票

如果无法正确理解,很乐意对此进行更新,但是这里有一些示例可能会有所帮助。请注意,这使用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'

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()
© www.soinside.com 2019 - 2024. All rights reserved.