[PATCH coffee-flask] Fix timezone related issue

Datetime in database is stored in UTC format. Currently we are in UTC +2 timezone (GMT +1). Because of time shifts fixing the time cannot be done in a static way. Dynamic solution is using paramater 'localtime' in SQL query function date(). Therefore it is required for the target device to have properly set timezone. --- coffee_db.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/coffee_db.py b/coffee_db.py index 8c18e63..d3f659c 100644 --- a/coffee_db.py +++ b/coffee_db.py @@ -58,10 +58,10 @@ def add_coffee(uid, flavor, time=None): def list_coffees(uid=None): c = conn.cursor() if uid is None: - for row in c.execute("select id, time, flavor from coffees"): + for row in c.execute("select id, date(time, 'localtime'), flavor from coffees"): print(row) else: - for row in c.execute("select time, flavor from coffees where id = ?", (uid,)): + for row in c.execute("select date(time, 'localtime'), flavor from coffees where id = ?", (uid,)): print(row) def flavors(): @@ -96,7 +96,7 @@ def coffee_history(uid=None): if uid is None: res = list(c.execute(""" select strftime('%s', ds.d),count(c.flavor),c.flavor from - (select num,date('now',-num || ' days') as d from days) ds + (select num,date('now', 'localtime', -num || ' days') as d from days) ds left join coffees c on d = date(c.time) group by d, c.flavor """)) @@ -104,9 +104,9 @@ def coffee_history(uid=None): res = list(c.execute( """ select strftime('%s', ds.d),count(c.flavor),c.flavor from - (select num,date('now',-num || ' days') as d from days) ds + (select num,date('now', 'localtime', -num || ' days') as d from days) ds left join - (select time,flavor from coffees where id = ?) c + (select date(time, 'localtime') as time,flavor from coffees where id = ?) c on d = date(c.time) group by d, c.flavor """ , (uid,))) @@ -125,10 +125,10 @@ def coffee_count(uid=None, start=None, stop=None): args.append(uid) if start is not None: - clauses.append("date(time) >= date('now', '-%d days')" % int(start)) + clauses.append("date(time, 'localtime') >= date('now', 'localtime', '-%d days')" % int(start)) if stop is not None: - clauses.append("date(time) <= date('now', '-%d days')" % int(stop)) + clauses.append("date(time, 'localtime') <= date('now', 'localtime', '-%d days')" % int(stop)) for count, in c.execute( "select count(*) from coffees where " + -- 2.7.4

Ahoj Jardo, a jaký že jsou ty "issues"? Předpokládám, že něco jako že když si dáš kafe v jednu ráno, tak ti ho to v grafu zobrazí v jednom sloupci s kafemi ze včerejška. Asi bych ten patch mohl aplikovat i tak, jak je, ale úplně správně není. Viz níže. Pokud to nechceš předělávat, tak aspoň uprav commit message. On Fri, Sep 07 2018, Jaroslav Klapalek wrote:
Datetime in database is stored in UTC format.
Ne format, ale time zone.
Currently we are in UTC +2 timezone (GMT +1). Because of time shifts fixing the time cannot be done in a static way.
Dynamic solution is using paramater 'localtime' in SQL query function date(). Therefore it is required for the target device to have properly set timezone.
To je zaručené, protože převod do UTC se děje v terminálu (viz main.js). Naopak teoretický problém je převod zpět, který se děje na serveru a server může být v jiné časové zóně než terminál. Univerzálně správné řešení by tedy mělo být takové, že browser v požadavku pošle svou časovou zónu (bohužel se zdá, že se to neděje automaticky) a server vygeneruje grafy podle časové zóny klienta. Aby se to snadno dělalo, asi není vhodné nechat převod časových zón na sqlite, ale dělat to v pythonu. K tomu by šlo s výhodou použít "type converters" https://docs.python.org/3.5/library/sqlite3.html#default-adapters-and-conver..., (např. select time as time [timestamp] from coffees). Pak by z databáze nepadaly stringy, ale datetime objekty, kde se dají snadno časové zóny převádět. Ale asi je to pro náš projekt overkill :)
--- coffee_db.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/coffee_db.py b/coffee_db.py index 8c18e63..d3f659c 100644 --- a/coffee_db.py +++ b/coffee_db.py @@ -58,10 +58,10 @@ def add_coffee(uid, flavor, time=None): def list_coffees(uid=None):
Tahle funkce se asi vůbec nepoužívá. Spíš bych jí smazal (v jiném commitu).
c = conn.cursor() if uid is None: - for row in c.execute("select id, time, flavor from coffees"): + for row in c.execute("select id, date(time, 'localtime'), flavor from coffees"): print(row) else: - for row in c.execute("select time, flavor from coffees where id = ?", (uid,)): + for row in c.execute("select date(time, 'localtime'), flavor from coffees where id = ?", (uid,)): print(row)
def flavors(): @@ -96,7 +96,7 @@ def coffee_history(uid=None): if uid is None: res = list(c.execute(""" select strftime('%s', ds.d),count(c.flavor),c.flavor from - (select num,date('now',-num || ' days') as d from days) ds + (select num,date('now', 'localtime', -num || ' days') as d from days) ds left join coffees c on d = date(c.time) group by d, c.flavor """)) @@ -104,9 +104,9 @@ def coffee_history(uid=None): res = list(c.execute( """ select strftime('%s', ds.d),count(c.flavor),c.flavor from - (select num,date('now',-num || ' days') as d from days) ds + (select num,date('now', 'localtime', -num || ' days') as d from days) ds left join - (select time,flavor from coffees where id = ?) c + (select date(time, 'localtime') as time,flavor from coffees where id = ?) c on d = date(c.time) group by d, c.flavor """ , (uid,))) @@ -125,10 +125,10 @@ def coffee_count(uid=None, start=None, stop=None): args.append(uid)
if start is not None: - clauses.append("date(time) >= date('now', '-%d days')" % int(start)) + clauses.append("date(time, 'localtime') >= date('now', 'localtime', '-%d days')" % int(start))
if stop is not None: - clauses.append("date(time) <= date('now', '-%d days')" % int(stop)) + clauses.append("date(time, 'localtime') <= date('now', 'localtime', '-%d days')" % int(stop))
for count, in c.execute( "select count(*) from coffees where " + -- 2.7.4
_______________________________________________ Coffee mailing list Coffee@rtime.felk.cvut.cz https://rtime.felk.cvut.cz/mailman/listinfo/coffee
participants (2)
-
Jaroslav Klapalek
-
Michal Sojka