This is a quick article to demonstrate how to compare two datetime values with the timezone specified.
Why?
A client's ZohoCRM had a different timezone setting than the user a script would be run as. The time difference was just one hour but this caused problems if comparing two datetime values. In this particular case, we needed to check on the expiry of an access token used in OAuth2.0 for an API.
How?
All with deluge but we will split the date and time value obtained from a CRM field and compare it to the current time combined with a timezone. In this particular case, we will switch the current time to Europe/London (You can use an abbreviation such as GMT but this doesn't seem to check if daylight savings is in effect):
Example of taking a CRM date-time value (expiryTime) and appending toTime() prematurely - DO NOT USE
v_CustomTime = "2020-03-25 20:41:07".toTime().toString("yyyy-MM-dd HH:mm:ss"); v_ExpiryTime = "2020-03-25T21:41:07+00:00"; info v_CustomTime.toTime(); info v_ExpiryTime.toTime(); // yields // 25-Mar-2020 20:41:07 // 25-Mar-2020 00:00:00
- v_CustomTime = "2020-03-25 20:41:07".toTime().toString("yyyy-MM-dd HH:mm:ss");
- v_ExpiryTime = "2020-03-25T21:41:07+00:00";
- info v_CustomTime.toTime();
- info v_ExpiryTime.toTime();
- // yields
- // 25-Mar-2020 20:41:07
- // 25-Mar-2020 00:00:00
Example of splitting date-time value and then comparing:
v_CustomTime = "2020-03-25 20:41:07".toTime().toString("yyyy-MM-dd HH:mm:ss"); v_ExpiryTime = "2020-03-25T21:41:07+00:00"; v_ExpiryDatePart = v_ExpiryTime.subString(0,10); v_ExpiryTimePart = v_ExpiryTime.subString(11,19); v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart; info v_CustomTime.toTime(); info v_ExpiryTimeCheck.toTime(); // yields // 25-Mar-2020 20:41:07 // 25-Mar-2020 21:41:07
- v_CustomTime = "2020-03-25 20:41:07".toTime().toString("yyyy-MM-dd HH:mm:ss");
- v_ExpiryTime = "2020-03-25T21:41:07+00:00";
- v_ExpiryDatePart = v_ExpiryTime.subString(0,10);
- v_ExpiryTimePart = v_ExpiryTime.subString(11,19);
- v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart;
- info v_CustomTime.toTime();
- info v_ExpiryTimeCheck.toTime();
- // yields
- // 25-Mar-2020 20:41:07
- // 25-Mar-2020 21:41:07
Setting a TimeZone to a value that is in Zoho date time format - DO NOT USE
v_CurrentTime = zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ss", "Europe/London"); v_ExpiryTime = "2020-03-25T21:41:07+00:00"; v_ExpiryDatePart = v_ExpiryTime.subString(0,10); v_ExpiryTimePart = v_ExpiryTime.subString(11,19); v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart; info v_CurrentTime.toTime(); info v_ExpiryTimeCheck.toTime(); // yields // 25-Mar-2020 00:00:00 // 25-Mar-2020 21:41:07
- v_CurrentTime = zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ss", "Europe/London");
- v_ExpiryTime = "2020-03-25T21:41:07+00:00";
- v_ExpiryDatePart = v_ExpiryTime.subString(0,10);
- v_ExpiryTimePart = v_ExpiryTime.subString(11,19);
- v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart;
- info v_CurrentTime.toTime();
- info v_ExpiryTimeCheck.toTime();
- // yields
- // 25-Mar-2020 00:00:00
- // 25-Mar-2020 21:41:07
Setting a TimeZone and extracting the date and time
v_CurrentTime = zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ss", "Europe/London"); v_CurrentDatePart = v_CurrentTime.subString(0,10); v_CurrentTimePart = v_CurrentTime.subString(11,19); v_CurrentTimeCheck = v_CurrentDatePart + " " + v_CurrentTimePart; v_ExpiryTime = "2020-03-25T21:41:07+00:00"; v_ExpiryDatePart = v_ExpiryTime.subString(0,10); v_ExpiryTimePart = v_ExpiryTime.subString(11,19); v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart; info v_CurrentTimeCheck.toTime(); info v_ExpiryTimeCheck.toTime(); // yields // 25-Mar-2020 20:41:07 // 25-Mar-2020 21:41:07 v_CompareResult = if(v_ExpiryTimeCheck.toTime() <= v_CurrentTimeCheck.toTime(), "Expired", "Valid"); info v_CompareResult; // yields "Valid" // or if comparing against current time anyway v_CompareResult = if(v_ExpiryTimeCheck.toTime() <= zoho.currenttime, "Expired", "Valid"); info v_CompareResult; // yields "Valid"
- v_CurrentTime = zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ss", "Europe/London");
- v_CurrentDatePart = v_CurrentTime.subString(0,10);
- v_CurrentTimePart = v_CurrentTime.subString(11,19);
- v_CurrentTimeCheck = v_CurrentDatePart + " " + v_CurrentTimePart;
- v_ExpiryTime = "2020-03-25T21:41:07+00:00";
- v_ExpiryDatePart = v_ExpiryTime.subString(0,10);
- v_ExpiryTimePart = v_ExpiryTime.subString(11,19);
- v_ExpiryTimeCheck = v_ExpiryDatePart + " " + v_ExpiryTimePart;
- info v_CurrentTimeCheck.toTime();
- info v_ExpiryTimeCheck.toTime();
- // yields
- // 25-Mar-2020 20:41:07
- // 25-Mar-2020 21:41:07
- v_CompareResult = if(v_ExpiryTimeCheck.toTime() <= v_CurrentTimeCheck.toTime(), "Expired", "Valid");
- info v_CompareResult;
- // yields "Valid"
- // or if comparing against current time anyway
- v_CompareResult = if(v_ExpiryTimeCheck.toTime() <= zoho.currenttime, "Expired", "Valid");
- info v_CompareResult;
- // yields "Valid"
Error(s):
- Operator <= is not valid for TEXT expression You are comparing to text values rather than two datetimes. Which is why we need the above to set the variables to the date-time datatype so it compares on time value rather than text.
- Setting a timezone to the date/time returned by CRM would subtract or add hours depending on your location to our existing value. So we leave it alone as the CRM value is the value to compare.