Преобразование читаемого времени в Unix время с Python - PullRequest
1 голос
/ 03 апреля 2012

Я создаю своего рода веб-приложение с календарем

Я создал следующую форму в HTML, где пользователь настраивает событие / встречу.

Данные, введенные пользователем, затемидет в python.

Я хотел бы иметь возможность хранить введенную дату в виде метки времени Unix в базе данных SQLite, при этом отображая ее как читаемые даты, когда это необходимо.

Есть лиВ любом случае я могу быстро конвертировать между ними?

               <form method="post" action="/writeEvent">

                    <div>
                     <label>Year ("yyyy") <span class="required">*</span></label>
                     <input name="year" type="text" id="year" value="" />
                    </div>

                    <div>
                     <label>Month ("mm")  <span class="required">*</span></label>
                     <input name="month" type="password" id="month" value="" />
                    </div>

                    <div>
                     <label>Day ("dd") <span class="required">*</span></label>
                     <input name="day" type="password" id="day" value="" />
                    </div>

                    <div>
                     <label>Message <span class="required">*</span></label>
                     <textarea name="message" rows="20" cols="30"  id="message" value="" ></textarea><br /><br />
                    </div>

                    <div>
                    <input type="submit"  value="Submit" class="button">
                    <input type="reset" value="Reset" class="button">
                    </div>


                </form>

РЕДАКТИРОВАТЬ: У меня нет никакого кода Python как такового, кроме как я пробую что-то в терминале.

У меня естьпопытался использовать localtime(), чтобы дать мне удобочитаемое время.Однако это дается в формате

(tm_year=2012, tm_mon=4, tm_mday=3, tm_hour=19, tm_min=9, tm_sec=13, tm_wday=1, tm_yday=94, tm_isdst=0) 

Я попытался извлечь только год, месяц и день, сначала присвоив его переменной, выполнив

newTime=time.localtime()

Нопоявляется сообщение об ошибке с неверным синтаксисом на знаке равенства.Кажется, я не могу присвоить результат переменной.

Я также пытался использовать mktime () для генерации метки времени.Однако, когда я делаю

timeStamp = time.mktime(2012,04,03)

, я сталкиваюсь с ошибкой, говорящей

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: mktime() takes exactly one argument (0 given)

Так что теперь я не знаю, что делать дальше, любая помощь будет очень признательна.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 03 апреля 2012

time.mktime() дает вам эту ошибку, потому что ожидается, что это кортеж из 9 элементов, который является одним аргументом, тогда как вы даете ему 3 целых числа.

Есть несколько способов получитьзначения года, месяца, дня и превратить их в метку времени Unix.

Во-первых, поскольку у вас есть только 3 элемента, может быть проще всего использовать модуль datetime :

import datetime
dt = datetime.datetime(2012, 1, 10)

Получив этот объект даты и времени, вы можете преобразовать его в время эпохи несколькими способами.Если вы хотите работать с этим временем UTC, вы можете преобразовать его в хронологию UTC, а затем использовать календарный модуль , чтобы преобразовать его в эпоху:

timetuple = dt.utctimetuple()
epoch = calendar.timegm(timetuple)

Есливы работаете с местным временем, тогда вы можете выполнить эту часть, используя модуль времени

timetuple = dt.timetuple()
epoch = time.mktime(timetuple)

Как подсказал @Here You Go в своем ответе, если вы можете просто сохранить свою строку вsql, и пусть он обрабатывает преобразование даты как тип реальной даты, что было бы предпочтительнее, и я буду откладывать его ответ на этот маршрут.

Чтобы вернуться к объекту datetime из метки времени utc, вы можете сделать:

datetime.datetime.utcfromtimestamp(epoch)

А объект datetime позволяет получить доступ ко всем его отдельным компонентам:

dt.year
dt.month
dt.day

Для простого форматирования строки вы можете создать строку, подобную этой:

dateString = "%s-%s-%s" % (year, month, day)
0 голосов
/ 03 апреля 2012

Для этого вы можете использовать модуль даты и времени из стандартной библиотеки.

from datetime import date, datetime

# Create a date object from the form fields
appointment = date(day=20, month=12, year=2013)

# Return a unix time stamp from it
stamp = appointment.strftime('%s')

# Create a datetime object from a time stamp
now = datetime.fromtimestamp(stamp)

# Returns a prettily formatted string of the datetime object
print now.strftime('%H:%M - %A the %d of %B')
# See the docs here 
# http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior 
# for additional options provided for strftime

Теперь вы можете сделать это таким образом.Но, видя, что вы используете Python, вы можете подумать о хранении объектов даты и времени в базе данных как кортежей времени или о захвате информации о часовом поясе с помощью объектов даты и времени, осведомленных о tz.

0 голосов
/ 03 апреля 2012

Почему бы просто не сохранить его как строку и не выполнять преобразование? sqlite по-прежнему позволит вам делать математику даты:

SQLite version 3.7.10 2012-01-16 13:28:40
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE dates (the_date TEXT);
sqlite> INSERT INTO dates VALUES ('2012-09-13 02:13');
sqlite> INSERT INTO dates VALUES ('2012-10-01 01:15');
sqlite> INSERT INTO dates VALUES ('2012-10-16 08:42');
sqlite> SELECT MIN(the_date) FROM dates;
2012-09-13 02:13
sqlite> SELECT MAX(the_date) FROM dates;
2012-10-16 08:42
sqlite> SELECT the_date FROM dates ORDER BY the_date;
2012-09-13 02:13
2012-10-01 01:15
2012-10-16 08:42
sqlite> SELECT DATE(the_date, '+1 year') FROM dates ORDER BY the_date;
2013-09-13
2013-10-01
2013-10-16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...