Εμφάνιση 1-6 από 6
  1. #1
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Μετά από αρκετό ψάξιμο, βρήκα ότι δεν μπορείς να αποθηκεύσης 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 δεν αλλάζουν.

    Ευχαριστώ.
    Τελευταία επεξεργασία από το μέλος babaliaris : 26-04-21 στις 00:17.

  2. #2
    Εγγραφή
    29-05-2007
    Περιοχή
    δυο κλικ πιο κατω
    Ηλικία
    48
    Μηνύματα
    7.585
    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:να ακολουθεις αυτο που ψαχνεις , οχι αυτο που σε βρισκει .

  3. #3
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    δεν είμαι σίγουρος...

    - - - Updated - - -

    Εντάξει το βρήκα παιδιά. Τελικά δεν χρειάζεται, διότι το ISO 8601 είναι πάντα σε UTC+00:00 . Δηλαδή δεν λαμβάνει υπόχην του καθόλου time offsets.

    Απλώς στο application layer παίρνω το local time, το μετατρέπω σε UTC time και το αποθηκεύω στην βασή. Μετά όποιος και να πάρει αυτό το UTC time απλώς το μετατρέπει σε local time την τελευταία στιγμή
    (πρωτού εμφανιστεί στην χρήστη) και θα δείχνει την σωστή local ώρα.

  4. #4
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.438
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Παράθεση Αρχικό μήνυμα από babaliaris Εμφάνιση μηνυμάτων
    Εντάξει το βρήκα παιδιά. Τελικά δεν χρειάζεται, διότι το ISO 8601 είναι πάντα σε UTC+00:00 . Δηλαδή δεν λαμβάνει υπόχην του καθόλου time offsets.

    Απλώς στο application layer παίρνω το local time, το μετατρέπω σε UTC time και το αποθηκεύω στην βασή. Μετά όποιος και να πάρει αυτό το UTC time απλώς το μετατρέπει σε local time την τελευταία στιγμή
    (πρωτού εμφανιστεί στην χρήστη) και θα δείχνει την σωστή local ώρα.
    Αυτή είναι, σε γενικές γραμμές, η καλύτερη μέθοδος για να κρατήσεις την ώρα. Σχεδόν όλες οι γλώσσες έχουν μετατροπή από/προς 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 αλλά ακόμα, ευτυχώς, δεν το έχω αντιμετωπίσει σαν πρόβλημα)!

  5. #5
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Σε node.js χρησημοποιώ την dayjs βιβλιοθήκη. αν έχεις πχ 1996-01-03T22:00:00.000Z τότε αν κάνεις
    Κώδικας:
    dayjs("1996-01-03T22:00:00.000Z").format("YYYY-MM-DD")
    τότε σου δίνει την σωστή ημερομηνία που είναι 1996-01-04.

    Αλλά θα το έχω υπόψην αυτό που λες. Επίσης γράφω αρκετά ΤΕΣΤ για να είμαι σίγουρος ότι όλα είναι σωστά.
    Έτσι κατέληξα να ρωτήσω για αυτό το πρόβλημα εξαρχής
    Εγώ έστελνα την ημερομηνία σε μορφή 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.

  6. #6
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.438
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Αν δεν κάνω λάθος όταν η 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

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας