将时间戳转换为 QDateEdit 和相反
Converting timestamp into QDateEdit and the opposite
我已经创建了一个 QWidget,我想转换时间戳并通过按下设置按钮将日期放入 QDateEdit。并从 QDateEdit 中获取值,将其转换为时间戳,然后通过按下打印按钮将其放入 QLabel 中。到目前为止一切顺利,但如果我得到从 QDateEdit 创建的时间戳并将其放入 QLineEdit 并重新开始,我可以看到我错过了一天。怎么了?
例如:
输入:1532386800.0 >>> 进入 QDateEdit(设置按钮):23/07/2018 >>> 输出(打印按钮):1532300400.0
输入:1532300400.0 >>> 进入 QDateEdit:22/07/2018 >>> output:1532214000.0
输入:1532214000.0 >>> 进入 QDateEdit:21/07/2018 >>> output:1532127600.0
每次我将时间戳转换为日期,然后将日期转换回时间戳,我都会损失一天。我在一些在线转换网页中也发现了同样的问题。
我认为这个问题很及时。当您从 QDateEdit 获取日期时,时间为 00:00:00
from PyQt4 import QtCore, QtGui
import time
import datetime
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
inputDateFormat = "yyyy-MM-dd"
outputDateFormat = "dd/MM/yyyy"
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.dateEdit = QtGui.QDateEdit(Form)
self.dateEdit.setGeometry(QtCore.QRect(40, 120, 110, 27))
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
self.print_btn = QtGui.QPushButton(Form)
self.print_btn.setGeometry(QtCore.QRect(190, 120, 98, 27))
self.print_btn.setObjectName(_fromUtf8("print_btn"))
self.set_btn = QtGui.QPushButton(Form)
self.set_btn.setGeometry(QtCore.QRect(190, 90, 98, 27))
self.set_btn.setObjectName(_fromUtf8("set_btn"))
self.date_input = QtGui.QLineEdit(Form)
self.date_input.setGeometry(QtCore.QRect(10, 90, 171, 27))
self.date_input.setObjectName(_fromUtf8("date_input"))
self.label = QtGui.QLabel(Form)
self.label.setGeometry(QtCore.QRect(30, 190, 81, 16))
self.label.setObjectName(_fromUtf8("label"))
self.timestamp = QtGui.QLabel(Form)
self.timestamp.setGeometry(QtCore.QRect(120, 190, 120, 17))
self.timestamp.setObjectName(_fromUtf8("timestamp"))
self.retranslateUi(Form)
QtCore.QObject.connect(self.print_btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.printTimestamp)
QtCore.QObject.connect(self.set_btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setTime)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.print_btn.setText(_translate("Form", "print", None))
self.set_btn.setText(_translate("Form", "set", None))
self.date_input.setText(_translate("Form", "1532386800.0", None)) # 946684800.0
# self.date_input.setText(_translate("Form", "2018-07-24 19:24:11.272000", None))
self.label.setText(_translate("Form", "Timestamp:", None))
self.timestamp.setText(_translate("Form", "123456", None))
def setTime(self):
obj = self.dateEdit
# f = '%Y-%m-%d %H:%M:%S'
# time.strftime(f, now)
# This is how to get a date from QDateEdit Element
pyDate = obj.date().getDate() # obj.date().toPyDate() returns a tuple(read only list)
pyDatetime = obj.dateTime().toPyDateTime() # datetime() returns QDateTime, toPyDateTime() converts to datetime.datetime
# This is how to put a date into QDateEdit Element
# a = '2018-07-24 19:24:11.272000'
stamp = float(self.date_input.text())
tmToDate = datetime.datetime.utcfromtimestamp(stamp).strftime('%Y-%m-%d %H:%M:%S')
print tmToDate
aCustomersDate = tmToDate.split(" ")[0]
d = QtCore.QDate.fromString(aCustomersDate, self.inputDateFormat)
date = d.toPyDate()
# Get the current date
newDate = QtCore.QDateTime.currentDateTime()
pyToday = newDate.toPyDateTime()
# newDate =QtCore.QDate.currentDate()
# pyToday = newDate.toPyDate()
# formalDate = obj.date().toString(self.outputDateFormat) # Returns QString
formalDate = obj.dateTime().toPyDateTime()
print 'PyDate(input): %s, pyDateTime: %s, Date: %s'%(pyDate, pyToday, formalDate)
output = formalDate
obj.setDate(date)
def printTimestamp(self):
obj = self.dateEdit
# formalDate = str( obj.date().toString(self.outputDateFormat) )
formalDate = obj.dateTime().toPyDateTime().strftime('%d/%m/%Y %H:%M:%S') # Returns datetime.datetime
print formalDate
tstamp = str( time.mktime(datetime.datetime.strptime(formalDate, "%d/%m/%Y %H:%M:%S").timetuple()) )
print tstamp
self.timestamp.setText(tstamp)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
所有这些 time
、datetime
、QDate
有点令人困惑,但最后我发现了问题所在。我在不同时区从时间戳转换为 QDate,从 QDate 转换为时间戳。最后,这是使用本地时区转换的解决方案:
class Ui_Form(object):
...
def setTime(self):
# This is how to put a date into QDateEdit Element using a timestamp
# aTime = '2018-07-24 19:24:11.272000'
unix_timestamp = float(self.date_input.text())
# tmToDate = datetime.datetime.utcfromtimestamp(unix_timestamp).strftime('%Y-%m-%d %H:%M:%S')
# utc_time = time.gmtime(unix_timestamp)
local_datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(unix_timestamp)) # converts timestampt to local time and apply the format
local_date = local_datetime.split(" ")[0] # get only the date
d = QtCore.QDate.fromString(local_date, "yyyy-MM-dd") # Convert date into QDate object
self.dateEdit.setDate(d)
def printTimestamp(self):
# This is how to get a date from QDateEdit Element
# pyDate_str = self.dateEdit.date().toString(self.outputDateFormat) # Returns QString
# pyDate = self.dateEdit.date().toPyDate()
# date = self.dateEdit.date().getDate()
pyDatetime = self.dateEdit.dateTime().toPyDateTime() # dateTime() returns QDateTime, toPyDateTime() converts to datetime.datetime
formalDate = pyDatetime.strftime('%d/%m/%Y %H:%M:%S') # Returns datetime.datetime
tstamp = time.mktime(datetime.datetime.strptime(formalDate, '%d/%m/%Y %H:%M:%S').timetuple())
self.timestamp.setText(str(tstamp))
我已经创建了一个 QWidget,我想转换时间戳并通过按下设置按钮将日期放入 QDateEdit。并从 QDateEdit 中获取值,将其转换为时间戳,然后通过按下打印按钮将其放入 QLabel 中。到目前为止一切顺利,但如果我得到从 QDateEdit 创建的时间戳并将其放入 QLineEdit 并重新开始,我可以看到我错过了一天。怎么了?
例如:
输入:1532386800.0 >>> 进入 QDateEdit(设置按钮):23/07/2018 >>> 输出(打印按钮):1532300400.0
输入:1532300400.0 >>> 进入 QDateEdit:22/07/2018 >>> output:1532214000.0
输入:1532214000.0 >>> 进入 QDateEdit:21/07/2018 >>> output:1532127600.0
每次我将时间戳转换为日期,然后将日期转换回时间戳,我都会损失一天。我在一些在线转换网页中也发现了同样的问题。
我认为这个问题很及时。当您从 QDateEdit 获取日期时,时间为 00:00:00
from PyQt4 import QtCore, QtGui
import time
import datetime
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
inputDateFormat = "yyyy-MM-dd"
outputDateFormat = "dd/MM/yyyy"
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.dateEdit = QtGui.QDateEdit(Form)
self.dateEdit.setGeometry(QtCore.QRect(40, 120, 110, 27))
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
self.print_btn = QtGui.QPushButton(Form)
self.print_btn.setGeometry(QtCore.QRect(190, 120, 98, 27))
self.print_btn.setObjectName(_fromUtf8("print_btn"))
self.set_btn = QtGui.QPushButton(Form)
self.set_btn.setGeometry(QtCore.QRect(190, 90, 98, 27))
self.set_btn.setObjectName(_fromUtf8("set_btn"))
self.date_input = QtGui.QLineEdit(Form)
self.date_input.setGeometry(QtCore.QRect(10, 90, 171, 27))
self.date_input.setObjectName(_fromUtf8("date_input"))
self.label = QtGui.QLabel(Form)
self.label.setGeometry(QtCore.QRect(30, 190, 81, 16))
self.label.setObjectName(_fromUtf8("label"))
self.timestamp = QtGui.QLabel(Form)
self.timestamp.setGeometry(QtCore.QRect(120, 190, 120, 17))
self.timestamp.setObjectName(_fromUtf8("timestamp"))
self.retranslateUi(Form)
QtCore.QObject.connect(self.print_btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.printTimestamp)
QtCore.QObject.connect(self.set_btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setTime)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.print_btn.setText(_translate("Form", "print", None))
self.set_btn.setText(_translate("Form", "set", None))
self.date_input.setText(_translate("Form", "1532386800.0", None)) # 946684800.0
# self.date_input.setText(_translate("Form", "2018-07-24 19:24:11.272000", None))
self.label.setText(_translate("Form", "Timestamp:", None))
self.timestamp.setText(_translate("Form", "123456", None))
def setTime(self):
obj = self.dateEdit
# f = '%Y-%m-%d %H:%M:%S'
# time.strftime(f, now)
# This is how to get a date from QDateEdit Element
pyDate = obj.date().getDate() # obj.date().toPyDate() returns a tuple(read only list)
pyDatetime = obj.dateTime().toPyDateTime() # datetime() returns QDateTime, toPyDateTime() converts to datetime.datetime
# This is how to put a date into QDateEdit Element
# a = '2018-07-24 19:24:11.272000'
stamp = float(self.date_input.text())
tmToDate = datetime.datetime.utcfromtimestamp(stamp).strftime('%Y-%m-%d %H:%M:%S')
print tmToDate
aCustomersDate = tmToDate.split(" ")[0]
d = QtCore.QDate.fromString(aCustomersDate, self.inputDateFormat)
date = d.toPyDate()
# Get the current date
newDate = QtCore.QDateTime.currentDateTime()
pyToday = newDate.toPyDateTime()
# newDate =QtCore.QDate.currentDate()
# pyToday = newDate.toPyDate()
# formalDate = obj.date().toString(self.outputDateFormat) # Returns QString
formalDate = obj.dateTime().toPyDateTime()
print 'PyDate(input): %s, pyDateTime: %s, Date: %s'%(pyDate, pyToday, formalDate)
output = formalDate
obj.setDate(date)
def printTimestamp(self):
obj = self.dateEdit
# formalDate = str( obj.date().toString(self.outputDateFormat) )
formalDate = obj.dateTime().toPyDateTime().strftime('%d/%m/%Y %H:%M:%S') # Returns datetime.datetime
print formalDate
tstamp = str( time.mktime(datetime.datetime.strptime(formalDate, "%d/%m/%Y %H:%M:%S").timetuple()) )
print tstamp
self.timestamp.setText(tstamp)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
所有这些 time
、datetime
、QDate
有点令人困惑,但最后我发现了问题所在。我在不同时区从时间戳转换为 QDate,从 QDate 转换为时间戳。最后,这是使用本地时区转换的解决方案:
class Ui_Form(object):
...
def setTime(self):
# This is how to put a date into QDateEdit Element using a timestamp
# aTime = '2018-07-24 19:24:11.272000'
unix_timestamp = float(self.date_input.text())
# tmToDate = datetime.datetime.utcfromtimestamp(unix_timestamp).strftime('%Y-%m-%d %H:%M:%S')
# utc_time = time.gmtime(unix_timestamp)
local_datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(unix_timestamp)) # converts timestampt to local time and apply the format
local_date = local_datetime.split(" ")[0] # get only the date
d = QtCore.QDate.fromString(local_date, "yyyy-MM-dd") # Convert date into QDate object
self.dateEdit.setDate(d)
def printTimestamp(self):
# This is how to get a date from QDateEdit Element
# pyDate_str = self.dateEdit.date().toString(self.outputDateFormat) # Returns QString
# pyDate = self.dateEdit.date().toPyDate()
# date = self.dateEdit.date().getDate()
pyDatetime = self.dateEdit.dateTime().toPyDateTime() # dateTime() returns QDateTime, toPyDateTime() converts to datetime.datetime
formalDate = pyDatetime.strftime('%d/%m/%Y %H:%M:%S') # Returns datetime.datetime
tstamp = time.mktime(datetime.datetime.strptime(formalDate, '%d/%m/%Y %H:%M:%S').timetuple())
self.timestamp.setText(str(tstamp))