Week of year

Former Member
Former Member
Hello all,

sorry for my bad english, because i´m from Germany.

My question:
Can i display the number of week in a WatchFace?
I hope you understand what i mean.
Now we have week 13 (https://whatweekisit.com/)
This is what i mean.

Great
Heiko
  • Former Member
    Former Member over 8 years ago
    Well, I never really did these calculations before since in Android Java there's always trustworthy Calendar.getInstance.get(Calendar. WEEK_OF_YEAR), but I do like to reinvent wheels if it seems interesting enough 8)) According to provided Wiki, and I must admit, that this info was new to me, I'd change my code to this (checked to compile and run in simulator):

    ...
    Sys.println("today is "+ getWeekNumber(Time.now()) +"th week");
    Sys.println("01.01.2016 belongs to "+ getWeekNumber(Greg.moment({:year => 2016, :month => 1, :day => 1, :hour => 0, :minute => 0, :second => 0})) +" week");
    Sys.println("03.01.2016 belongs to "+ getWeekNumber(Greg.moment({:year => 2016, :month => 1, :day => 3, :hour => 0, :minute => 0, :second => 0})) +" week");
    Sys.println("04.01.2016 belongs to "+ getWeekNumber(Greg.moment({:year => 2016, :month => 1, :day => 4, :hour => 0, :minute => 0, :second => 0})) +" week");
    ...
    function getWeekNumber(moment) {
    var dateInfo = Greg.info(moment, Time.FORMAT_SHORT);
    var firstDayOfTheYear = Greg.moment({:year => dateInfo.year, :month => 1, :day => 1, :hour => 0, :minute => 0, :second => 0});
    var dayInAYear = (moment.value() - firstDayOfTheYear.value()) / 86400;
    var weekNumber = dayInAYear / 7;
    var firstDayDoW = Greg.info(firstDayOfTheYear, Time.FORMAT_SHORT).day_of_week;
    // var lastDayOfFirstWeek = 9 - firstDayDoW; //my bad: Friday = 6, Satudray = 7, Sunday = 1
    var lastDayOfFirstWeek = (9 - firstDayDoW) % 7;
    return weekNumber == 0 && (firstDayDoW == 1 || firstDayDoW >= 6) && dateInfo.day <= lastDayOfFirstWeek ?
    getWeekNumber(Greg.moment({:year => dateInfo.year - 1, :month => 12, :day => 31, :hour => 0, :minute => 0, :second => 0})) :
    (weekNumber + 1);
    }


    Thanks a lot for this

    But there is a small problem with it, it reports the week of today as week 46, but it is week 45, at least in Europe.

    Did a liittle more testing below, and week 1 is a bit short, it only contains 4 days according to this implementation :-)

    today is week 46
    2016-01-01 is week 53
    2016-01-02 is week 53
    2016-01-03 is week 53
    2016-01-04 is week 1
    2016-01-05 is week 1
    2016-01-06 is week 1
    2016-01-07 is week 1
    2016-01-08 is week 2
    2016-01-09 is week 2
    2016-01-10 is week 2
    2016-01-11 is week 2
    2016-01-12 is week 2
    2016-01-13 is week 2
    2016-01-14 is week 2
    2016-01-15 is week 3
    2016-01-16 is week 3
    2016-01-17 is week 3
  • I'm going to file a feature request to have the week of the year added to the API. I doubt it'll be high priority, but at least it'll be on the books. :)
  • Former Member
    Former Member over 8 years ago
    2 KenJen2:
    I think, that now I know kung-fu 8)) Or at least the fact, that first week of the year is a week, where 4th January is, and the number of weeks is not the current day of the year divided by 7 days in a week, but difference between day number of this week's Thursday and first week of the year Thursday. Check out my latest "wheel", output seems consistent so far...

    Sys.println("today is "+ getWeekNumber(Time.now()) +"th week");
    Sys.println("2015.12.31 is week "+ getWeekNumber(Greg.moment({:year => 2015, :month => 12, :day => 31})));
    for (var ind = 1; ind < 32; ind++) {
    Sys.println("2016.01."+ ind +" is week "+ getWeekNumber(Greg.moment({:year => 2016, :month => 1, :day => ind})));
    }
    Sys.println("2016.12.31 is week "+ getWeekNumber(Greg.moment({:year => 2016, :month => 12, :day => 31})));

    function getWeekNumber(moment) {
    var dateInfo = Greg.info(moment, Time.FORMAT_SHORT);
    var firstDay = Greg.moment({:year => dateInfo.year, :month => 1, :day => 1, :hour => 0, :minute => 0, :second => 0});
    var firstDayDoW = Greg.info(firstDay, Time.FORMAT_SHORT).day_of_week;
    firstDayDoW = firstDayDoW == 1 ? 8 : firstDayDoW;
    var firstTuesday = firstDay.value() + (firstDayDoW > 5 ? (4 + 8 - firstDayDoW) : (5 - firstDayDoW)) * 86400;
    var thisTuesday = moment.value() + (5 - (dateInfo.day_of_week == 1 ? 8 : dateInfo.day_of_week)) * 86400;
    var currentWeek = ((thisTuesday - firstTuesday) / 604800f + 1.5f).toNumber();
    return currentWeek == 0 ?
    getWeekNumber(Greg.moment({:year => dateInfo.year - 1, :month => 12, :day => 31, :hour => 0, :minute => 0, :second => 0})) :
    currentWeek;
    }


    Btw, it would be nice if Travis made his entrance to show us how it's done.
  • I'm not sure this is correct of if it is the most efficient implementation, but it is what I have.

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

    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; // days past thursday
    var week_of_year = (given_day_of_year - first_day_of_year + day_of_week + 4) / 7;

    // week is at end of this year or the beginning of next year
    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;
    }
    }

    // week is in previous year, try again under that year
    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;
    }

    // any old week of the year
    else {
    return week_of_year;
    }
    }
  • Former Member
    Former Member over 8 years ago
    2 KenJen2:
    I think, that now I know kung-fu 8)) Or at least the fact, that first week of the year is a week, where 4th January is, and the number of weeks is not the current day of the year divided by 7 days in a week, but difference between day number of this week's Thursday and first week of the year Thursday. Check out my latest "wheel", output seems consistent so far...

    Sys.println("today is "+ getWeekNumber(Time.now()) +"th week");
    Sys.println("2015.12.31 is week "+ getWeekNumber(Greg.moment({:year => 2015, :month => 12, :day => 31})));
    for (var ind = 1; ind < 32; ind++) {
    Sys.println("2016.01."+ ind +" is week "+ getWeekNumber(Greg.moment({:year => 2016, :month => 1, :day => ind})));
    }
    Sys.println("2016.12.31 is week "+ getWeekNumber(Greg.moment({:year => 2016, :month => 12, :day => 31})));

    function getWeekNumber(moment) {
    var dateInfo = Greg.info(moment, Time.FORMAT_SHORT);
    var firstDay = Greg.moment({:year => dateInfo.year, :month => 1, :day => 1, :hour => 0, :minute => 0, :second => 0});
    var firstDayDoW = Greg.info(firstDay, Time.FORMAT_SHORT).day_of_week;
    firstDayDoW = firstDayDoW == 1 ? 8 : firstDayDoW;
    var firstTuesday = firstDay.value() + (firstDayDoW > 5 ? (4 + 8 - firstDayDoW) : (5 - firstDayDoW)) * 86400;
    var thisTuesday = moment.value() + (5 - (dateInfo.day_of_week == 1 ? 8 : dateInfo.day_of_week)) * 86400;
    var currentWeek = ((thisTuesday - firstTuesday) / 604800f + 1.5f).toNumber();
    return currentWeek == 0 ?
    getWeekNumber(Greg.moment({:year => dateInfo.year - 1, :month => 12, :day => 31, :hour => 0, :minute => 0, :second => 0})) :
    currentWeek;
    }


    Btw, it would be nice if Travis made his entrance to show us how it's done.


    Thanks a lot for this code, but it still seems like it not quite right :-)

    See below, there is no week 53 in 2014, it should have been week 1.

    I will try to test Travis code now, and see how that works.

    I didn't imagine that this would be so complicated :-)

    2014-12-26 is week 52
    2014-12-27 is week 52
    2014-12-28 is week 52
    2014-12-29 is week 53
    2014-12-30 is week 53
    2014-12-31 is week 53
    2015-01-01 is week 1
    2015-01-02 is week 1
    2015-01-03 is week 1
    2015-01-04 is week 1
    2015-01-05 is week 2
    2015-01-06 is week 2
    2015-01-07 is week 2
    2015-01-08 is week 2
    2015-01-09 is week 2
    2015-01-10 is week 2
    2015-01-11 is week 2
    2015-01-12 is week 3
    2015-01-13 is week 3
  • Former Member
    Former Member over 8 years ago
    I'm not sure this is correct of if it is the most efficient implementation, but it is what I have.

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

    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; // days past thursday
    var week_of_year = (given_day_of_year - first_day_of_year + day_of_week + 4) / 7;

    // week is at end of this year or the beginning of next year
    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;
    }
    }

    // week is in previous year, try again under that year
    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;
    }

    // any old week of the year
    else {
    return week_of_year;
    }
    }


    Thanks a lot Travis

    This is working like a charm, I have tested it with several years containing both 52 and 53 years, also years starting before and after thursday, and everything seems to work fine.

    This is an excellent forum, really good support :-)