190. DataTime ParseExact

רובנו מכירים את הטיפוס הידוע לשמצה DateTime. מדי פעם אנחנו נתקלים בצורך לפרסר תאריך מstring המייצג אותו, או להפך – להפוך DateTime למחרוזת המייצגת אותו.

הדרך הפופולרית לעשות זאת היא באמצעות הפונקציות ToString וDateTime.Parse.

למשל:

1
2
DateTime rememberRemember = new DateTime(1997, 11, 5);
string rememberRememberString = rememberRemember.ToString();

ופרסור חזרה מהמחרוזת:

1
2
DateTime rememberRemember =
DateTime.Parse(rememberRememberString);

הדוגמה הזאת בדרך כלל עובדת, אבל היא יכולה גם לא לעבוד.

למה שלא תעבוד? הסיבה היא שתאריכים, בניגוד לרוב הטיפוסים האחרים, הם משהו שתלוי בהגדרות המחשב.

למשל, בארצות הברית כותבים את ה5 בנובמבר 1997 בצורה הבאה:

11/05/1997

ואילו בארץ כך:

05/11/1997

מה שיכול לקרות הוא שמחשב אחד כותב את התאריך בצורת מחרוזת לאנשהו ומחשב אחר קורא אותו מאותו מקום.

מה שיקרה זה אחד מהשניים:

  1. המחשב השני יקרא את התאריך לא נכון (למשל, יקרא ה11 למאי, במקום ה5 לנובמבר)
  2. המחשב השני יזרוק Exception כיוון שהתאריך לא תקין לפי הפורמט שהוא מצפה לקבל לפי הגדרות המחשב (למחשב, אם התאריך הוא ה13 בנובמבר, הוא ינסה לקרוא אותו בתור ה11 לחודש ה13 ויזרוק Exception)

בעיה זו היא בעיה די נפוצה בעבודה עם מחרוזות המייצגות תאריכים.

איך אפשר להתגבר על הבעיה? במקום להשתמש בToString וDateTime.Parse שלא מקבלים פרמטרים ומשתמשים בהגדרות של המחשב, נוכל להשתמש בOverload של ToString שמקבל פרמטר המציין כיצד לכתוב את הstring:

1
2
string rememberRememberString =
rememberRemember.ToString("dd/MM/yyyy HH:mm:ss");

ובפונקציה ההפוכה ששמה DateTime.ParseExact:

1
2
3
4
DateTime rememberRemember =
DateTime.ParseExact(rememberRememberString,
"dd/MM/yyyy HH:mm:ss",
null);

ככה נוכל להיות בטוחים שתאריכים שלנו נקראים ונכתבים למחרוזות בצורה הנכונה.

החסרון הוא שבכל מקום שאנחנו מתעסקים עם פרסור תאריכים, נצטרך לעשות איזשהו טיפול כזה.

סוף שבוע המתפרסר בצורה מדויקת טוב

שתף