System.TypeException: Invalid date/time

ליאור נכתב על ידי ליאור לביא, עודכן בתאריך 12/10/2022

הודעת השגיאה

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];

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