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.
- 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() - 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, suchw23.
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
Post a Comment