Iso week

Former Member
Former Member

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

  • Former Member
    Former Member in reply to Shent-Aurkhan (SHN)

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

  • Former Member
    Former Member in reply to bine8x8

    Thank you very much for your answer too. Where did you get the "algorithm" ? You built yourself? Are you using it on any watchface?

  • I built this "algorithm" yourself and use it in WF AdjustableAnalogRebith.

  • Former Member
    Former Member in reply to bine8x8

    Thanks