Διαχείριση ημερομηνιών σε .NET
Είναι πολλές περιπτώσεις όπου η διαχείριση ημερομηνιών μπορεί να δημιουργήσει διάφορα προβλήματα σε μια εφαρμογή. Οι αλλαγές σε θερινή ώρα ή η λήψη/ προβολή δεδομένων για χρήστες σε διαφορετικές ζώνες ώρας (π.χ. κάποιο forum) μπορούν να προκαλέσουν πονοκέφαλο σε έναν προγραμματιστή. Η προσέγγιση που πρέπει να ακολουθήσει κάποιος σε αυτήν την περίπτωση είναι να χρησιμοποιεί ο προγραμματιστής την UTC ώρα, που είναι η βασική ώρα για όλο τον κόσμο. Δεν είναι η ώρα του Greenwich (GMT), διότι η GMT έχει και θερινή ώρα.
Οι βασικοί κανόνες που πρέπει κάποιος προγραμματιστής να ακολουθήσει είναι ότι όλες οι ημερομηνίες χειρίζονται και αποθηκεύονται από την εφαρμογή είναι σε UTC. Ας δούμε λοιπόν πως μπορούμε να πάρουμε την UTC ώρα με το .NET. Οι δύο παρακάτω αναθέσεις είναι ισοδύναμες.
DateTime myUTCTime; myUTCTime = DateTime.Now.ToUniversalTime(); myUTCTime = DateTime.UtcNow;
Αν θέλουμε να πάρουμε τη UTC ώρα μέσα σε ένα SQL ερώτημα (MsSql Server) μπορούμε να χρησιμοποιήσουμε την GETUTCDATE(), η οποία έχει ακρίβεια δευτερολέπτου. Υπάρχει επίσης και η SYSGETUTCDATE() η οποία επιστρέφει την ίδια τιμή, αλλά με ακρίβεια μεγαλύτερη από την GETUTCDATE().
SELECT GETUTCDATE() SELECT SYSUTCDATETIME()
Η αντίστροφη διαδικασία μπορεί να γίνει στο .NET με τη χρήση της συνάρτησης ToLocalTime().
myLocalTime = myTime.ToLocalTime();
Σε desktop εφαρμογές αυτό συνήθως είναι αρκετό, διότι η μετατροπή θα γίνει στο timezone του χρήστη, κάτι που είναι σωστό. Σε ένα asp.net web application η μετατροπή θα γίνει στο timezone του server, κάτι που δεν είναι σωστό αν ο web server και οι χρήστες της εφαρμογής βρίσκονται σε διαφορετικό timezone.
Πρέπει λοιπόν να γνωρίζουμε σε ποιο timezone βρίσκεται ο χρήστης. Το .NET διαθέτει μία λίστα με τα timezones και είναι αυτό το Array με TimeZoneInfo αντικείμενα. Αυτή η πληροφορία βρίσκεται στο σύστημα και ενημερώνεται μέσα από τα Windows Update. Είναι σίγουρα πολύ καλύτερα από το να διατηρούμε μόνοι μας έναν πίνακα στη ΒΔ!
Στο παράδειγμα παρακάτω βλέπετε και πως μπορούμε να το κάνουμε bind σε ένα <asp:DropDownList> control:
TimeZonesDropDownList.DataSource = TimeZoneInfo.GetSystemTimeZones(); TimeZonesDropDownList.DataValueField = "id"; TimeZonesDropDownList.DataTextField = "DisplayName"; TimeZonesDropDownList.DataBind();
Κάθε αντικείμενο του Array περιέχει πληροφορίες για κάθε timezone, όπως π.χ. το offset του σε ώρες από την UTC ώρα, αν το timezone βρίσκεται σε θερινή ώρα κτλ. Αυτές οι πληροφορίες είναι αρκετές για να κάνουμε σωστά τη μετατροπή από Universal σε Local ώρα. ΤΟ .NET παρέχει όμως έτοιμες συναρτήσεις για αυτή τη διαδικασία, όπως φαίνεται στις παρακάτω functions.
public DateTime ConvertToLocalTime(DateTime myUTCDate, string tzID) { TimeZoneInfo myTzInfo = TimeZoneInfo.FindSystemTimeZoneById(tzID); return TimeZoneInfo.ConvertTimeFromUtc(myUTCDate, myTzInfo); } public DateTime ConvertToUTC(DateTime myLocalDate, string tzID) { TimeZoneInfo myTzInfo = TimeZoneInfo.FindSystemTimeZoneById(tzID); return TimeZoneInfo.ConvertTimeToUtc(myLocalDate, myTzInfo); }
Συνοψίζοντας, η εφαρμογή μας διαχειρίζεται πάντα τις ημερομηνίες σε UTC ώρα. Επίσης κάνουμε την απαραίτητη μετατροπή όταν παίρνουμε δεδομένα από κάποιο χρήστη και την ανάποδη μετατροπή όταν παρουσιάζουμε δεδομένα στον χρήστη.
Πηγή άρθρου: Managing dates in .net




Γίνετε επεξεργασία, Παρακαλώ περιμένετε...









Κανενα σχολιο