根据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'))
如果无法正确理解,很乐意对此进行更新,但是这里有一些示例可能会有所帮助。请注意,这使用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'
我只是添加此类,以可能节省下一个家伙一点时间。如果有人觉得这有用,请支持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()