System.TypeException: Invalid date/time
הודעת השגיאה
System.TypeException: Invalid date/time
למה אנחנו רואים את הודעת השגיאה הזאת?
הודעת השגיאה System.TypeException: Invalid date/time עשויה להופיע כאשר ננסה להריץ שאילתה בקוד ב-Apex עם פורמט זמן לא תקין. לדוגמה, אם ניתן ללקוח אפשרות להזין תאריך כפרמטר לשאילתה ב-LWC.
השאילתה הבאה תרוץ בצורה תקינה ב-Apex:
SELECT Id FROM Contact WHERE CreatedDate > 2022-01-01T09:00:00+03:00
אבל אם ננסה להריץ אותה עם משתנה תאריך מסוג מחרוזת באופן הבא, נקבל הודעת שגיאה:
String myDateTime = '2022-01-01T09:00:00+03:00';
List myContacts = [SELECT Id FROM Contact WHERE CreatedDate > :dt];
Line: 3, Column: 28 Invalid bind expression type of String for column of type Datetime
דרך אחת לנסות ולפתור את הבעיה היא לנסות ולבצע המרה מ-String ל-Datetime באופן הבא:
String myDateTime = '2022-01-01T09:00:00+03:00';
Datetime myParsedDatetime = Datetime.parse(myDateTime);
List myContacts = [SELECT Id FROM Contact WHERE CreatedDate > :myParsedDatetime];
אלא שניסיון זה יכשל והודעת השגיאה שנקבל היא זאת שאיתה פתחנו את הפוסט:
Line: 2, Column: 1 System.TypeException: Invalid date/time: 2022-01-01T09:00:00+03:00
פתרון
כדי לפתור את בעיית ההמרה ממחרוזת ל-Datetime מבלי לקבל את הודעת שגיאה עבור Parsing נרצה להשתמש במתודה deserialize של המחלקה JSON כדי לבצע Cast למחרוזת שלנו ל-Datetime באופן הבא:
String myDateTime = '2022-01-01T09:00:00+03:00';
Datetime dt = (DateTime)JSON.deserialize('"' + myDateTime + '"', DateTime.class);
List myContacts = [SELECT Id FROM Contact WHERE CreatedDate > :dt];
כעת נוכל להריץ את הקוד שלנו בהצלחה עם התאריך המקורי כמחרוזת.