A quick article on determining the week number of the year if your week starts on a Monday and not a Sunday.
Why?
I think it's the US system which generally says that a week starts on a Sunday but in the United Kingdom, the week generally starts on a Monday. So let's say there's a schedule that has to be run weekly and include all the orders of a specific week...
Just to confuse everyone in the world, the day index for a Sunday is 7 (ie. myDate.toString("u") returns 7) and the week commences on a Sunday (ie. myDate.toStartOfWeek("EEEE") returns Sunday). In other words, the day counting starts at 7, followed by 1 for Monday, 2 for Tuesday, and so on...
How?
The logic behind this would be to take the date of the order, check if the order date is a Sunday, subtract a day, and return the week number:
c_Order = Order[ID == 123456890123456890]; if(c_Order.Order_Date != null) { v_ThisDate = c_Order.Order_Date.toString("EEEE, dd-MMM-yyyy u w"); v_ThisWeek = if(c_Order.Order_Date.toString("u").toLong()==7,c_Order.Order_Date.subDay(1),c_Order.Order_Date).toString("w"); } // Monday, 26-Jun-2023 1 26 // yields: 26 // // Sunday, 02-Jul-2023 7 27 // yields: 26 // // Monday, 03-Jul-2023 1 27 // yields: 27 // // Sunday, 09-Jul-2023 7 28 // yields: 27
- c_Order = Order[ID == 123456890123456890];
- if(c_Order.Order_Date != null)
- {
- v_ThisDate = c_Order.Order_Date.toString("EEEE, dd-MMM-yyyy u w");
- v_ThisWeek = if(c_Order.Order_Date.toString("u").toLong()==7,c_Order.Order_Date.subDay(1),c_Order.Order_Date).toString("w");
- }
- // Monday, 26-Jun-2023 1 26
- // yields: 26
- //
- // Sunday, 02-Jul-2023 7 27
- // yields: 26
- //
- // Monday, 03-Jul-2023 1 27
- // yields: 27
- //
- // Sunday, 09-Jul-2023 7 28
- // yields: 27
Originally, I had this formula which seemed to do the same thing but unnecessarily moved the pointer to the start of the week. It could also error eventually if Zoho made it possible to change the start of the week (this is in ZohoCreator; I'm aware that some of Zoho Apps do allow this) in the app which would possibly affect the functionality of .toStartOfWeek().
v_ThisWeek = if(c_Order.Order_Date.toStartOfWeek() == c_Order.Order_Date,c_Order.Order_Date.toStartOfWeek().subDay(1),c_Order.Order_Date.toStartOfWeek()).toString("w");
- v_ThisWeek = if(c_Order.Order_Date.toStartOfWeek() == c_Order.Order_Date,c_Order.Order_Date.toStartOfWeek().subDay(1),c_Order.Order_Date.toStartOfWeek()).toString("w");
Additional:
-
I'm just adding a little extra based on the further feedback, if we're generating a reporting year and week, we have to look at the difference between .toString("y") and .toString("Y"). Lowercase 'y' is the year and uppercase 'Y' is the year the week is in. Weeks which overlap at the end/start of the year need to be observed. As per the documentation:copyraw
dateValue = '29-Dec-2019'; info dateValue.toString("yyyy"); // returns 2019 dateValue = '29-Dec-2019'; info dateValue.toString("YYYY"); // returns 2020
- dateValue = '29-Dec-2019';
- info dateValue.toString("yyyy"); // returns 2019
- dateValue = '29-Dec-2019';
- info dateValue.toString("YYYY"); // returns 2020
-
You should also pad single digit week numbers if we're going to store a year week value:
copyraw
v_ThisCurrentWeekNumber = if(zoho.currentdate.toString("u").toLong() == 7,zoho.currentdate.subDay(1),zoho.currentdate).toString("w"); v_ThisCurrentWeekNumberPadded = v_ThisCurrentWeekNumber.leftPad(2).replaceAll(" ", "0", true); // // or // v_ThisCurrentWeekNumber = if(zoho.currentdate.toString("u").toLong() == 7,zoho.currentdate.subDay(1),zoho.currentdate).toString("ww"); // // 7 returns '07' // 52 return '52'
- v_ThisCurrentWeekNumber = if(zoho.currentdate.toString("u").toLong() == 7,zoho.currentdate.subDay(1),zoho.currentdate).toString("w");
- v_ThisCurrentWeekNumberPadded = v_ThisCurrentWeekNumber.leftPad(2).replaceAll(" ", "0", true);
- //
- // or
- //
- v_ThisCurrentWeekNumber = if(zoho.currentdate.toString("u").toLong() == 7,zoho.currentdate.subDay(1),zoho.currentdate).toString("ww");
- //
- // 7 returns '07'
- // 52 return '52'
Source(s):