java - How to convert year and week of year obtained from MongoDB query into Joda datetime? -


i'm using $year , $week in mongodb aggregation query group results year , week of year. in java code want convert returned year, week of year datetime object, allow easier presentation of data.

it seems joda datetime's getweekofweekyear() doesn't behave same way $week in mongodb, , causes different date results.

  1. scenario 1

mongodb query:

db.test.aggregate(   {$project:    {week: {$week: isodate("2016-01-01t00:00:00.000z") },     year: {$year: isodate("2016-01-01t00:00:00.000z") } }   } ) 

returns:

{ "_id" : "", "week" : 0, "year" : 2016 } 

when trying convert values joda datetime object, throws exception: illegalfieldvalueexception.

(new datetime(0, datetimezone.utc)).withweekyear(2016).withweekofweekyear(0).withdayofweek(1).tostring() 
  1. scenario 2

in addition, when querying 2015-05-10, sunday.

mongodb query:

db.test.aggregate(   {$project:    {week: {$week: isodate("2016-01-01t00:00:00.000z") },     year: {$year: isodate("2016-01-01t00:00:00.000z") } }   } ) 

returns:

{ "_id" : "", "week" : 19, "year" : 2015 } 

but when trying convert joda datetime, results in previous week, starts @ 2015-05-04:

(new datetime(0, datetimezone.utc)).withweekyear(2015).withweekofweekyear(19).withdayofweek(1).tostring() 

results in:

2015-05-04t00:00:00.000z 

mongo $week operator returns week of year number between 0 , 53. weeks begin on sundays, , week 1 begins first sunday of year. days preceding first sunday of year in week 0. in java, weekofyear returned value, first week of year in @ least 4 days in year. result of definition, day 1 of first week may in previous year. week starts on monday.

is there way solve inconsistency in java code?

iso 8601

joda-time follows iso 8601 standard in defining weeks.

  • monday first day of week.
  • weeks numbered 1 52 or 53.
  • week numbers written uppercase w, such w23.
    year may prepended, 2015-w23.
  • week # 1, w01, contains year's first thursday.

as far know, standard definition has been growing more common in usage in various countries , industries.

sunday weeks

the mongodb doc defines weeks as:

…the week of year date number between 0 , 53.

weeks begin on sundays, , week 1 begins first sunday of year. days preceding first sunday of year in week 0. behavior same “%u” operator strftime standard library function.

as far know, american definition, not used outside us.

why definition 0 53? means "up 54 weeks". don't think definition produce 54 weeks in year, i've not thought through.

why mix?

you cannot mix 2 definitions. why bother? if goal use mongodb’s definition of weeks, , represent them date-time, write own converter.

my own advice ditch mongodb’s definition , function, , stick standard definition.

find sunday

if want find sunday starting week in mongodb’s world, write own little function. feed in year number , week number, , datetime. in scenario, have no need joda-time’s week-of-year features.

something this.

int yearnumber = 2015; int weeknumber = 0;  localdate firstweeksunday = null; localdate firstofyear = new localdate ( yearnumber, 1, 1 ); if ( firstofyear.getdayofweek ( ) == datetimeconstants.sunday ) {     firstweeksunday = firstofyear; } else { // else not sunday.     firstweeksunday = firstofyear.minusdays ( firstofyear.getdayofweek ( ) );  // joda-time uses standard iso 8601 weeks, monday = 1, sunday = 7. } localdate sunday = firstweeksunday.plusweeks ( weeknumber );  datetimezone zone = datetimezone.forid ( "america/montreal" ); datetime datetime = sunday.todatetimeatstartofday ( zone ); 

dump console.

system.out.println ( "sunday-based week of year:" + yearnumber + " week: " + weeknumber + " starts: " + sunday + "." ); system.out.println ( "adjusted time zone: " + zone + " is: " + datetime + "." ); 

when run.

sunday-based week of year:2015 week: 0 starts: 2014-12-28. adjusted time zone: america/montreal is: 2014-12-28t00:00:00.000-05:00. 

Comments

Popular posts from this blog

Email notification in google apps script -

c++ - Difference between pre and post decrement in recursive function argument -

javascript - IE11 incompatibility with jQuery's 'readonly'? -