Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

Îåêßíçóå áðü ôï ìÝëïò Elias.Tsokanis. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 14-03-2013, 14:52. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-03-2013, 12:47 72290

    Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Καλημέρα,

    αναφέρομαι στην περίπτωση που σε μηχάνημα έχουμε δηλώσει Regional Locale = "Greek".

    Δίνουμε σε ένα textbox την ημερομηνία "11/3/2013", δηλ. 11 Μαρτίου 2013. Την τιμή αυτή της ημερομηνίας την μεταφέρουμε σε μεταβλητή τύπου "Date" και παρατηρούμε από τον debugger ότι η μεταβλητή μας στον debugger εμφανίζεται ως #3/11/2013#, δηλ. με US Date Format. Αν εμφανίσουμε με ένα msgbox την μεταβλητή μας αυτή παίρνει πάλι την τιμή "11/3/2013" δηλ. με GR Date Format. Αν όμως διαχειριστούμε την μεταβλητή μας παρατηρούμε ότι η τιμή που έχει πάρει αντιστοιχεί πραγματικά σε "3 Νοεμβρίου 2013", δηλ. #3/11/2013# (με GR Format). Μπορείτε να το δοκιμάσετε. Κάθε σχόλιο ευπρόσδεκτο.

     

     

     

     

     

     

    Δημοσίευση στην κατηγορία: , ,
  •  12-03-2013, 12:06 72298 σε απάντηση της 72290

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Η ερώτηση ποιά είναι? Γιατί o debugger εμφανίζει το περιεχόμενο με το Invariant Culture (ΟΧΙ το US format) ενώ η εφαρμογή η οποία τρέχει στο ελληνικό locale το εμφανίζει με το locale? Δεν υπάρχει τίποτε περίεργο. 

    Η default συμπεριφορά όταν χρειάζεται να γίνει μετατροπή μίας τιμής σε string, είναι να χρησιμοποιηθεί το format που ορίζεται στο Thread.CultureInfo. Η αρχικη τιμή αυτού του CultureInfo προέρχεται από το system locale. Αν όμως η τιμή αυτή χρησιμοποιηθεί για ο,τιδήποτε πέρα από το να δείξεις ένα μήνυμα στο χρήστη, π.χ. για να αποθηκευτεί σε βάση, υπάρχει το πρόβλημα ότι αλλιώς θα κάνει τη μετατροπή ένας client που έχει ρυθμιστεί στα Ελληνικά και αλλιώς κάποιος που είναι ακόμα στα US English. 

    Η λύση ΔΕΝ είναι να αναγκάσεις το σύμπαν να γυρίσει στα Ελληνικά, παρότι πολλές ελληνικές εφαρμογές το προσπαθούν αυτό (το άτιμο το σύμπαν δεν συνεργάζεται). Η λύση είναι να χρησιμοποιήσεις το InvariantCulture, το οποίο εξασφαλίζει ότι τα δεκαδικά θα έχουν πχ. πάντα . αντί για , κλπ.

    Από εδώ και πέρα, η κάθε εφαρμογή μπορεί να αλλάξει το Thread.CultureInfo στη γλώσσα που θέλει. Έτσι μπορεί το Visual Studio να ορίζει ότι θα δείξει τις τιμές του debugger χρησιμοποιώντας το locale της γλώσσας του, δηλαδή τα Αγγλικά. Μπορεί η Γερμανική έκδοση να τα δείχνει διαφορετικά.

    Έτσι κι αλλιώς, δεν έχει καμμία σημασία πως θα φανούν αυτά στον debugger καθώς η τιμή παραμένει πάντα Date, δεν μετατρέπεται ποτέ σε string. Δεν υπάρχει θέμα μήπως μπλεχτούν μήνες με μέρες, εκτός και αν ο κώδικας σου όταν τρέχει προκαλέσει το πρόβλημα.

    Το τί θα δείξει ο debugger επηρεάζεται από το DebuggerDisplayAttribute ενός τύπου. Αν αυτό δεν υπάρχει, θα εμφανιστεί το αποτέλεσμα της κλήσης της ToString() επάνω στο αντικείμενο. Αναγκαστικά, η μετατροπή σε string θα γίνει χρησιμοποιώντας το Thread.CurrentCulture του Visual Studio με αποτέλεσμα οι τιμές να εμφανιστούν στο αντίστοιχο format.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-03-2013, 13:46 72300 σε απάντηση της 72298

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Ευχαριστώ για τις πολύ χρήσιμες παρατηρήσεις, ειδικά σε ότι αφορά τον debugger και το visual studio. Εκεί όλα είναι εντάξει. Η αλήθεια είναι ότι δεν προσπαθώ να γυρίσω το σύμπαν στα ελληνικά. Η εφαρμογή μου τρέχει μια χαρά με locale "EN-US" και δεν έχω κανένα πρόβλημα με αυτό όσον αφορά την διαχείρηση των ημερομηνιών. Θα γίνω όμως λίγο πιο συγκεκριμένος και ίσως να γίνει αντιληπτό το θέμα που αναφέρω παραπάνω. Καταρχάς τα προβλήματα αρχίζουν όταν χρησιμοποιούμε πεδία του SQL που είναι δηλωμένα "dates", και είναι παράληψή μου που δεν το ανέφερα στο πρώτο μου post. Δίνω ένα καλύτερο παράδειγμα:

    Ας πούμε ότι έχω στον SQL τρείς εγγραφές, όπου το ένα πεδίο είναι "Date". Εστω λοιπόν ότι οι αντίστοιχες ημερομηνίες είναι (κατά SQL πάντα για να μην μπερδευόμαστε)

    a) 2013-04-01 για τη πρώτη εγγραφή, δηλ. 1-Απριλίου-2013

    b) 2013-05-01 για τη δεύτερη, 1-Μαίου-2013

    c) 2013-06-01 για τη τρίτη, 1-Ιουνίου-2013

    Αν δοκιμάσω να "τραβήξω" τις εγγραφές αυτές από τον SQL με κριτήριο την ημερομηνία, π.χ. φέρε μου τις εγγραφές όπου ημερομηνία είναι μεγαλύτερη από την σημερινή (χρησιμοποιώ εδώ για τη σημερινή ημερομηνία το "Now()"), λογικά θα έπρεπε να μου φέρει και τις 3 εγγραφές αφού όλες είναι βέβαια μεγαλύτερες από την σημερινή. Με locale "Greek" δεν φέρνει καμιά εγγραφή.

     

     

  •  13-03-2013, 22:34 72319 σε απάντηση της 72300

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Αγαπητέ μου φίλε,

    Αν η ημερομήνια είναι σε παράμετρο και όχι με string concatenation στο query σου θα δουλέψει.


    Antonios Chatzipavlis

  •  14-03-2013, 11:04 72323 σε απάντηση της 72319

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Ευχαριστώ πολύ για την παρατήρηση. Θα το δοκιμάσω.

  •  14-03-2013, 11:30 72324 σε απάντηση της 72323

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Κάπου, κάπως, μετατρέπεις τα datetime σε string. Από τη στιγμή που τα πεδία είναι date και τα διαβάζεις σε μεταβλητές τύπου date, δεν έχει καμμία σημασία το locale. Επίσης, αν στα query σου περνάς sql parameters τύπου date, πάλι δεν έχει σημασία το locale.

    Το πρόβλημα εμφανίζεται πάντα όταν γίνει μία μετατροπή από/προς string, ως αποτέλεσμα π.χ. της δημιουργίας ενός statement με concatenation. Εκεί το SQL string θα δημιουργηθεί με τιμές που εξαρτώνται από το locale του web server/client αλλά ο SQL Server προφανώς θα προσπαθήσει να το ερμηνεύσει χρησιμοποιώντας το locale της βάσης.

    Εδώ είναι που πολλές ελληνικές εταιρείες αντί να κάνουν το προφανές και να διορθώσουν το bug τους,  προσπαθούν να αλλάξουν το σύμπαν, απαιτώντας ΟΛΟΙ οι clients, οι servers, και όλα τα collation της βάσης να είναι ελληνικά. 

    Υ.Γ. Τα παραπάνω ισχύουν για ΟΛΕΣ τις βάσεις δεδομένων, Oracle, DB2, MySQL, Access, Postgress, "βάλε-τη-δική-σου", όχι μόνο για τον SQL Server.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-03-2013, 14:32 72326 σε απάντηση της 72324

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Ευχαριστώ πολύ για τις διευκρινήσεις. Ηταν πολύ χρήσιμες. Η δοκιμή με sql parameterized queries ήταν απολύτως επιτυχής (αρκεί βέβαια και οι παράμετροι να είναι τύπου date).

  •  14-03-2013, 14:52 72327 σε απάντηση της 72326

    Απ: Διαχείρηση ημερομηνιών με Regional User Settings "Greek"

    Τα parameterized queries έχουν πολλά καλά. Πέρα από το ότι δεν σε απασχολούν θέματα locale, δεν έχουν και προβλήματα SQL injection. Αν φτιάξεις ένα statement με SQL concatenation το οποίο περιέχει το χαρακτήρα ', ο,τιδήποτε μετά από αυτόν θα θεωρηθεί κανονικό SQL statement. Πρέπει να έχεις δει αυτή τη φωτό με το τί μπορεί να συμβεί με string concatenation. Όταν όμως χρησιμοποιείς parameters, δεν υπάρχει περίπτωση μπερδέματος. Οι παράμετροι στέλνονται στον SQL Server ως ξεχωριστές παράμετροι κατά το service call, όχι ως τμήμα του statement.

    Το άλλο ΠΟΛΥ σημαντικό όφελος είναι στην ταχύτητα. Ο SQL Server κάνει compile κάθε statement και κρατάει το execution plan στη μνήμη, έτσι ώστε αν χρειαστεί να μπορέσει να το ξαναχρησιμοποιήσει. Όταν χρησιμοποιείς parameterized queries ο SQL Server μπορεί να βρει το παλιό execution plan και απλά να χρησιμοποιήσει διαφορετικές παραμέτρους. Όταν όμως χρησιμοποιείς string concatenation, κάθε statement θα χρειαστεί το δικό του execution plan εκτός και αν έχει ήδη προηγηθεί κάποιο ολόιδιο statement. Η διαφορά στις επιδόσεις σε φορτωμένα συστήματα είναι δραματική.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems