[Coffee] [PATCH coffee-flask] Fix timezone related issue
Michal Sojka
michal.sojka at cvut.cz
Fri Sep 7 23:46:04 CEST 2018
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-converters,
(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 at rtime.felk.cvut.cz
> https://rtime.felk.cvut.cz/mailman/listinfo/coffee
More information about the Coffee
mailing list