Μετά από αρκετό ψάξιμο, βρήκα ότι δεν μπορείς να αποθηκεύσης timezone times σε mysql χωρίς να χάσεις το offset time. Πολλοί όμως προτείνουν την παρακάτω λύση:
Αν έχει πχ ώρα Ελλάδος σε UTC 2021-04-25 00:04:30+03:00 το κάνεις split σε δύο κομμάτια date_time=2021-04-25 00:04:30 και offset=03:00
και στην Βάση αποθηκεύεις το date_time σε DATETIME column και το offset σε CHAR(5). Και για να τα πάρεις την UTC , απλώς διαβάζεις αυτά τα 2
πεδία από την Βάση και τα ενώνεις ξανά στην μορφή 2021-04-25 00:04:30+03:00.
Το θέμα είναι ότι όταν αλλάζει η ώρα πχ το καλοκαίρι (νομίζω αυτό λέγετε DST=daylight saving time) τότε αλλάζει και το UTC offset του κάθε timezone?
Δηλαδή αν το καλοκαίρι η ώρα Ελλάδος πάει 1 ώρα μπροστά τότε το UTC time γίνεται 2021-04-25 00:04:30+04:00 που σημαίνει ότι
το offset που έχω στην βάση έχει γίνει outdated? Αν ναι πως θα το λύσω αυτό το πρόβλημα;
Διάβασα από Wikipedia ότι το UTC δεν λαμβάνει υπόψιν του το DST αλλά δεν ξέρω αν αυτό σημαίνει ότι τα offsets δεν αλλάζουν.
Ευχαριστώ.
Εμφάνιση 1-6 από 6
-
26-04-21, 00:12 Πως αποθηκεύω UTC time σε MYSQL? #1
Τελευταία επεξεργασία από το μέλος babaliaris : 26-04-21 στις 00:17.
-
26-04-21, 00:25 Απάντηση: Πως αποθηκεύω UTC time σε MYSQL? #2
- Εγγραφή
- 29-05-2007
- Περιοχή
- δυο κλικ πιο κατω
- Ηλικία
- 48
- Μηνύματα
- 7.623
- Downloads
- 38
- Uploads
- 0
- Άρθρα
- 21
- Τύπος
- VDSL2
- Ταχύτητα
- 5000/1200
- ISP
- βρωμονταφον
- Router
- της hol
- SNR / Attn
- 8(dB) / 29(dB)
- Path Level
- Fastpath
μηπως βοηθαει καθολου αυτο ;
αντεχεις να αμφιβαλεις για ολα οσα εχεις διδαχτει ;
Cancel my subscription to the Resurrection. Send my credentials to the House of Detention
ο φασισμος ειναι ο νομος των δουλων
AV tip:να ακολουθεις αυτο που ψαχνεις , οχι αυτο που σε βρισκει .
-
26-04-21, 02:35 Απάντηση: Πως αποθηκεύω UTC time σε MYSQL? #3
δεν είμαι σίγουρος...
- - - Updated - - -
Εντάξει το βρήκα παιδιά. Τελικά δεν χρειάζεται, διότι το ISO 8601 είναι πάντα σε UTC+00:00 . Δηλαδή δεν λαμβάνει υπόχην του καθόλου time offsets.
Απλώς στο application layer παίρνω το local time, το μετατρέπω σε UTC time και το αποθηκεύω στην βασή. Μετά όποιος και να πάρει αυτό το UTC time απλώς το μετατρέπει σε local time την τελευταία στιγμή
(πρωτού εμφανιστεί στην χρήστη) και θα δείχνει την σωστή local ώρα.
-
26-04-21, 08:32 Απάντηση: Πως αποθηκεύω UTC time σε MYSQL? #4
Αυτή είναι, σε γενικές γραμμές, η καλύτερη μέθοδος για να κρατήσεις την ώρα. Σχεδόν όλες οι γλώσσες έχουν μετατροπή από/προς UTC και δεν μπλέκεις καθόλου με μετατροπές Daylight Saving.
Αρκεί να θυμάσαι ότι την μετατροπή πρέπει να την κάνει το πρόγραμμα του πελάτη και όχι ο server σου, αλλιώς μπορεί να έχεις πρόβλημα αν ο server έχει άλλο timezone από τον πελάτη!
Δεν ξέρω αν θα το αντιμετωπίσεις ποτέ, αλλά πρόσεξε αν έχεις ορίσει ένα πεδίο ως DateTime και κρατάς μόνο ημερομηνία (πχ o SQL Server δεν έχει πεδίο Date αλλά μόνο DateTime).
Αν ο χρήστης επιλέξει 26/04/2021, τότε αυτόματα μπαίνει και το 00:00 της ώρας. Αν μετατραπεί σε UTC όμως τότε γίνεται 25/04/2021-20:00, οπότε αλλάζει η ημερομηνία! Αν και δεν είναι το πιο σωστό αυτό που κάνω εγώ είναι, όταν αποθηκεύω σκέτη ημερομηνία να αποθηκεύω πάντα την ώρα ως 12:00 UTC, ώστε να έχω ένα ±12 για το local offset (υπάρχουν χώρες με +13, +14 αλλά ακόμα, ευτυχώς, δεν το έχω αντιμετωπίσει σαν πρόβλημα)!
-
26-04-21, 12:15 Απάντηση: Πως αποθηκεύω UTC time σε MYSQL? #5
Σε node.js χρησημοποιώ την dayjs βιβλιοθήκη. αν έχεις πχ 1996-01-03T22:00:00.000Z τότε αν κάνεις
Κώδικας:dayjs("1996-01-03T22:00:00.000Z").format("YYYY-MM-DD")
Αλλά θα το έχω υπόψην αυτό που λες. Επίσης γράφω αρκετά ΤΕΣΤ για να είμαι σίγουρος ότι όλα είναι σωστά.
Έτσι κατέληξα να ρωτήσω για αυτό το πρόβλημα εξαρχής
Εγώ έστελνα την ημερομηνία σε μορφή YYYY-MM-DD αποθηκευόταν σωστά στην βασή, αλλά όταν την έπαιρνα ο mysql connector που χρησιμοποιούσα
όταν κάνει select κάτι που έχει πεδίο DATE το κάνει απευθείας σε javascript Date object. και όταν το επέστρεφα στο response μου επέστρεφε 1996-01-03
αντί για 1996-01-04. Ευτυχώς τα τεστ μου το έπιασαν και μετά από μια μέρας debugging βρήκα τι έφταιγε. Τελικά βρήκα στο internet ότι καλό είναι όταν περνάω
ημερομηνίες σε API να της έχω σε μορφή ISO-8601 γιατί πολλές βιβλιοθήκες το έχουν ως standar. Σε εμένα το πρόβλημα ήταν ένας OPEN API VALIDATOR που
χρησιμοποιούσα και επειδή στο specification έλαγα ότι το response επιστρέφει YYYY-MM-DD αλλά αυτός το έπερνε σε μορφή ISO-8601 φαίνεται μου έκοβε το
string και κρατούσε μόνο το 1996-01-03.
Αν και τώρα που το σκέφτομαι παίζει να είναι bug του OPEN API VALIDATOR. Κανονικά θα έπρεπε να μου λέει ότι το response έχει invalid format. Θα δοκιμάσω
σε καθαρό project να δω αν όντως είναι bug, και θα το κανω ένα report.
-
26-04-21, 12:28 Απάντηση: Πως αποθηκεύω UTC time σε MYSQL? #6
Αν δεν κάνω λάθος όταν η Javascript φτιάχνει το Date Object, αν δεν βρει το offset, παίρνει το Local σαν offset. Εγώ κατέληξα σε κάποιες περιπτώσεις να προσθέτω το "Ζ" στο τέλος του string από το API ("1996-01-03T22:00:00.000") για να το αναγνωρίσει σαν Zulu Time (UTC +0) και μετά το έκανα Date για να πάρω το local.
Αν εσένα το api στο φέρνει μαζί με το Z στο τέλος, τότε μια χαρά. Αλλά μιας που φτιάχνεις test, βάλτου και την περίπτωση που έρθει χωρίς Z!
Bookmarks