Menu

פורמט DateTime ב-C#: מחרוזות פורמט סטנדרטיות ומותאמות, תרבות ו-ISO 8601

איך מעצבים DateTime כמחרוזת ב-C#: מחרוזות הפורמט הסטנדרטיות (d, D, o, s, u, t), תבניות מותאמות כמו yyyy-MM-dd HH:mm:ss, טבלה מלאה של מגדירי פורמט, איך התרבות משנה את הפלט, ISO 8601 עם round-trip באמצעות "o", והטעויות של mm מול MM ו-hh מול HH.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

DateTime.ToString(format) הופך תאריך לטקסט. הפורמט הוא או מחרוזת פורמט סטנדרטית (אות אחת כמו d או o, שהתבנית המדויקת שלה מגיעה מהתרבות) או תבנית מותאמת שבנויה ממגדירים כמו yyyy, MM ו-HH. אותן מחרוזות עובדות באינטרפולציה, $"{date:yyyy-MM-dd}", וב-string.Format.

פלט:

2026-10-09
2026-10-09 18:30:07
09/10/2026
Oct 9, 2026
Friday, October 9
6:30 PM
18:30:07.045
Shipped 2026-10-09 at 18:30

הדוגמאות בדף הזה מעבירות CultureInfo.InvariantCulture כדי שהפלט יהיה זהה בכל מחשב; בלעדיו, ToString משתמשת בתרבות הנוכחית, שיכולה לשנות שמות חודשים, מפרידים ואפילו את לוח השנה.

מגדירי פורמט מותאמים

פורמט מותאם הוא תבנית שבה אותיות מסוימות מייצגות חלקים של התאריך. הן רגישות לאותיות גדולות וקטנות: M הוא חודש ו-m הוא דקה, H היא השעה בפורמט 24 שעות ו-h השעה בפורמט 12 שעות.

מגדירמשמעותדוגמה עבור 2026-10-09 18:30:07.045
yyyyשנה, 4 ספרות2026
yyשנה, 2 ספרות26
MMMMשם חודש מלאOctober
MMMשם חודש מקוצרOct
MMחודש, 2 ספרות10
Mחודש, ספרה אחת או 210
ddddשם יום מלאFriday
dddשם יום מקוצרFri
ddיום בחודש, 2 ספרות09
dיום בחודש, ספרה אחת או 2 (בתוך תבנית)9
HHשעה, 00 עד 2318
Hשעה, 0 עד 2318
hhשעה, 01 עד 1206
hשעה, 1 עד 126
mmדקה, 2 ספרות30
ssשנייה, 2 ספרות07
fffאלפיות שנייה045
fffffffTicks (שבע ספרות אחרי הנקודה)0450000
ttציון AM/PMPM
zzzהיסט מ-UTC (DateTimeOffset או זמן מקומי)+02:00
Kמידע על אזור הזמן: Z, היסט, או כלוםZ (לערך UTC)
/מפריד התאריך של התרבות/ או . או -
:מפריד השעה של התרבות:
'text' או \cטקסט או תו מילולי'at'

כל תו אחר מועתק כמו שהוא. זה כולל אותיות שאינן מגדירים, וכך "YYYY-DD" מדפיס בשקט YYYY-DD: אין ב-.NET מגדיר Y או D באות גדולה.

אות אחת לבדה נקראת כפורמט סטנדרטי, לא כמותאם: ToString("d") היא תבנית התאריך הקצר, לא מספר היום. כדי לקבל רק את היום, כתבו ToString("%d") או השתמשו במאפיין Day.

פלט:

10/09/2026
9
20261009_183007
Week of Oct 9
18h30
2026-10-09T18:30:07
YYYY-DD

מחרוזות פורמט סטנדרטיות

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

פלט:

d  10/09/2026
D  Friday, 09 October 2026
f  Friday, 09 October 2026 18:30
g  10/09/2026 18:30
G  10/09/2026 18:30:07
M  October 09
Y  2026 October
t  18:30
T  18:30:07
o  2026-10-09T18:30:07.0000000Z
s  2026-10-09T18:30:07
u  2026-10-09 18:30:07Z
r  Fri, 09 Oct 2026 18:30:07 GMT
en-US d: 10/9/2026, D: Friday, October 9, 2026
קודשםתלוי תרבות?
d / Dתאריך קצר / ארוךכן
t / Tשעה קצרה / ארוכהכן
f / Fתאריך ארוך עם שעה קצרה / ארוכהכן
g / Gתאריך קצר עם שעה קצרה / ארוכהכן
Mחודש ויוםכן
Yשנה וחודשכן
oRound-trip ISO 8601, 7 ספרות אחרי הנקודה, אזור זמןלא
sISO 8601 שניתן למיון, בלי שברים, בלי אזור זמןלא
uאוניברסלי שניתן למיון, מסתיים ב-Zלא
rRFC 1123, ל-headers של HTTPלא

o, s, u ו-r מפיקים את אותו טקסט בכל תרבות, ולכן הם בטוחים ללוגים, לשמות קבצים ולהעברת נתונים. שימו לב שעל DateTime, u ו-r לא ממירים את הערך ל-UTC; הם מדפיסים אותו כמו שהוא ומתייגים אותו כ-UTC, אז קראו קודם ל-ToUniversalTime() (או השתמשו ב-DateTime.UtcNow) אם הערך מקומי. (על DateTimeOffset הם כן ממירים.)

התרבות משנה את הפלט

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

פלט:

en-US  10/9/2026
en-GB  09/10/2026
de-DE  09.10.2026
fr-FR  09/10/2026
ja-JP  2026/10/09
Freitag, 9. Oktober 2026
vendredi 9 octobre 2026
09.10.2026
09/10/2026

נתוני התרבות אינם קפואים. .NET על Linux ועל macOS קוראת אותם מספריית ICU שמותקנת במערכת, ומאז .NET 5 גם .NET על Windows 10 ואילך (.NET Framework משתמשת בנתוני ה-NLS של Windows עצמה), כך שתבנית יכולה להשתנות מעט בין גרסאות ופלטפורמות: גרסאות ICU עדכניות, למשל, שמות רווח צר בלתי שביר במקום רווח רגיל לפני "PM" בפורמט השעה הקצר של ארה"ב, וחלקן נותנות תאריכים קצרים בספרדית בלי האפס המוביל. זו עוד סיבה אף פעם לא לפענח טקסט שעוצב לתצוגה.

נובעים מזה שני כללים. לטקסט שאדם קורא, עצבו עם התרבות שלו (בשרת, זו שמגיעה מהבקשה, לא זו של השרת) והעדיפו פורמטים סטנדרטיים, כך שקורא גרמני יראה 09.10.2026 וקורא אמריקאי 10/9/2026. לטקסט שתוכנית קוראת, השתמשו ב-CultureInfo.InvariantCulture ובתבנית חד-משמעית כמו yyyy-MM-dd או o. תאריך שנכתב עם התרבות הנוכחית ופוענח במחשב אחר הוא מקור קלאסי לימים וחודשים שהתחלפו.

ISO 8601 ו-round-trip עם "o"

פורמט ה-round-trip "o" כותב כל tick ובנוסף את המידע על אזור הזמן, כך שפענוח הטקסט מחזיר בדיוק את אותו DateTime, כולל ה-Kind שלו:

פלט:

2026-10-09T18:30:07.0450000Z
2026-10-09T18:30:07.0450000
2026-10-09T20:30:07.0000000+02:00
True
Utc
2026-10-09T18:30:07Z
2026-10-09 20:30 +02:00

הסיומת Z מסמנת UTC; DateTime עם Kind מסוג Unspecified לא מקבל סיומת; זמן מקומי או DateTimeOffset מקבלים את ההיסט שלהם (+02:00). פענחו עם DateTimeStyles.RoundtripKind כדי שה-Kind ישרוד. serializers של JSON, מסדי נתונים ו-Date של JavaScript קוראים כולם את הפורמט הזה.

עיצוב TimeSpan

ל-TimeSpan יש קבוצה משלו, קטנה יותר, של מגדירים מותאמים: d (ימים), hh, mm, ss, ו-fff. בניגוד ל-DateTime, כל תו מילולי, כולל : ו-., חייב לקבל escape עם לוכסן הפוך או להיות במירכאות:

פלט:

1.03:25:09.1200000
1.03:25:09.1200000
03:25:09
1.03:25
25:09.120
27:25

hh בפורמט של TimeSpan הוא רכיב השעות (0 עד 23), כך שמשך של 27 שעות מודפס כ-03. לסכומים מעל יום, חשבו מתוך TotalHours כמו בשורה האחרונה. elapsed.ToString("hh:mm") בלי הלוכסן ההפוך זורק FormatException.

טעויות נפוצות

  • mm לחודש. "yyyy-mm-dd" מדפיס דקות באמצע: 2026-30-09. חודש הוא MM.
  • hh בלי tt. "hh:mm" הוא שעון 12 שעות בלי AM או PM, כך ש-06:30 דו-משמעי. השתמשו ב-HH לפורמט 24 שעות.
  • YYYY ו-DD. הם לא מגדירים ב-.NET; הם מודפסים כמו שהם. השתמשו ב-yyyy וב-dd.
  • / בתבנית לנתונים. זה מפריד התאריך של התרבות. שימו אותו במירכאות או השתמשו בתרבות הבלתי תלויה (invariant).
  • ToString() ברירת מחדל בלוגים או בקבצים. הפורמט תלוי במחשב. העבירו פורמט ותרבות.
  • זמן מקומי שמתויג כ-UTC. "u", "r" ו-'Z' שנכתב ביד לא ממירים; המירו קודם.
  • פענוח עם תבנית שונה מזו שבה כתבתם. שמרו מחרוזות פורמט לנתונים בקבוע אחד והשתמשו בו גם עם ToString וגם עם ParseExact.

שאלות נפוצות

איך מעצבים DateTime בפורמט yyyy-MM-dd ב-C#?

date.ToString("yyyy-MM-dd") נותן 2026-10-09. במחרוזת אינטרפולציה כתבו $"{date:yyyy-MM-dd}". הוסיפו " HH:mm:ss" בשביל השעה בפורמט 24 שעות. העבירו CultureInfo.InvariantCulture כארגומנט שני כשהטקסט מיועד לקובץ או לתוכנית אחרת, כדי שלוח השנה, שמות החודשים והמפרידים אף פעם לא יהיו תלויים במחשב.

מה ההבדל בין mm ל-MM בפורמטים של תאריכים ב-C#?

MM הוא החודש (01 עד 12) ו-mm הוא הדקה (00 עד 59). הפורמט רגיש לאותיות גדולות וקטנות, כך ש-yyyy-mm-dd מדפיס את הדקות במקום שבו אמור להיות החודש, באג שקל לפספס כשמעיפים מבט בערך בודד. באותו אופן HH היא השעה בפורמט 24 שעות ו-hh השעה בפורמט 12 שעות.

איך מעצבים DateTime ב-ISO 8601 ב-C#?

השתמשו בפורמט ה-round-trip "o": DateTime.UtcNow.ToString("o") נותן 2026-10-09T18:30:07.0450000Z, עם שבע ספרות אחרי הנקודה ו-Z עבור UTC או היסט עבור זמנים מקומיים. "s" נותן את הצורה הקצרה שניתנת למיון, בלי שברים ובלי אזור זמן, ו-"yyyy-MM-ddTHH:mm:ssZ" היא וריאציה מותאמת נפוצה.

איך מציגים AM ו-PM בפורמט תאריך ב-C#?

השתמשו ב-hh או ב-h לשעון 12 שעות וב-tt לציון AM/PM: date.ToString("h:mm tt", CultureInfo.GetCultureInfo("en-US")) נותן 6:30 PM. הציון מגיע מהתרבות, ולחלק מהתרבויות אין כזה, אז העבירו תרבות במפורש כשאתם צריכים AM ו-PM.

למה פורמט התאריך שלי מציג נקודות במקום לוכסנים?

במחרוזת פורמט, / הוא לא לוכסן מילולי אלא מפריד התאריך של התרבות, ו-: הוא מפריד השעה של התרבות. במחשב גרמני dd/MM/yyyy מדפיס 09.10.2026. שימו את התו במירכאות כדי לכפות אותו, dd'/'MM'/'yyyy, או עצבו עם CultureInfo.InvariantCulture.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל