Hello,
Is there any function or API to get the current iso Week?
If not, is there any barrel that makes this task easier? I find date methods on Monkey C to be very lacking.
Hello,
Is there any function or API to get the current iso Week?
If not, is there any barrel that makes this task easier? I find date methods on Monkey C to be very lacking.
here is a method I use:
using Toybox.Time.Gregorian as Date;
var now = Time.now();
var date = Date.info(now, Time.FORMAT_LONG);
var today = Date.info(now, Time.FORMAT_SHORT);
var Wnum = iso_week_number(today.year, today.month, today.day);
function iso_week_number(year, month, day){
var first_day_of_year = julian_day(year, 1, 1);
var given_day_of_year = julian_day(year, month, day);
var day_of_week = (first_day_of_year + 3) % 7;
var week_of_year = (given_day_of_year - first_day_of_year + day_of_week + 4) / 7;
if (week_of_year == 53) {
if (day_of_week == 6) {
return week_of_year;
}else if (day_of_week == 5 && is_leap_year(year)) {
return week_of_year;
} else {
return 1;
}
}
else if (week_of_year == 0) {
first_day_of_year = julian_day(year - 1, 1, 1);
day_of_week = (first_day_of_year + 3) % 7;
return (given_day_of_year - first_day_of_year + day_of_week + 4) / 7;
}
else {
return week_of_year;
}
}
private function julian_day(year, month, day)
{
var a = (14 - month) / 12;
var y = (year + 4800 - a);
var m = (month + 12 * a - 3);
return day + ((153 * m + 2) / 5) + (365 * y) + (y / 4) - (y / 100) + (y / 400) - 32045;
}
function is_leap_year(year){
if (year % 4 != 0) {
return false;
} else if (year % 100 != 0) {
return true;
}else if (year % 400 == 0) {
return true;
}
return false;
}
Wow, it is simpler than I expected.
Thank you very much! I really think this should be part of the official library tough.
lol pretty sure you can fin simpler method but it is what I use. I do agree with you.
I composed such a code.
Maybe this is not entirely accurate, but it seems to work.
var now = Cal.info(Time.now(), Time.FORMAT_SHORT);
week = {
:year => now.year,
:month => 1,
:day => 1,
:hour => 0,
};
week = Time.Gregorian.moment(week);
// день недели 1-го января
var jan1 = Cal.info(week, Time.FORMAT_SHORT).day_of_week;
week = week.value(); // start year
if (jan1==1) {
jan1=7;
} else {
jan1-=1;
}
if (jan1>4) {
jan1=8-jan1;
week += jan1*86400; // start 1st mon of year
} else {
jan1=3-jan1;
week -= jan1*86400; // start 1st mon of year
}
week = Time.now().value()-week;
if (week>=0) {
week = (1 + week/604800).toNumber();
} else {
week = 0;
}
I built this "algorithm" yourself and use it in WF AdjustableAnalogRebith.