package org.fluxtream.core.metadata; import java.util.List; import java.util.Map; import java.util.TimeZone; import org.fluxtream.core.TimeUnit; import org.fluxtream.core.TimezoneMap; import org.fluxtream.core.domain.metadata.VisitedCity; import org.fluxtream.core.utils.TimeUtils; import org.joda.time.DateTimeConstants; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; /** * User: candide * Date: 29/05/13 * Time: 18:19 */ public class MonthMetadata extends AbstractTimespanMetadata { public MonthMetadata(final int year, final int month) { final LocalDate firstDayOfMonth = TimeUtils.getBeginningOfMonth(year, month); this.startDate = TimeUtils.dateFormatter.print(firstDayOfMonth); this.start = firstDayOfMonth.toDateTimeAtStartOfDay().getMillis(); final LocalDate lastDayOfMonth = TimeUtils.getEndOfMonth(year, month); this.endDate = TimeUtils.dateFormatter.print(lastDayOfMonth); this.end = lastDayOfMonth.toDateTimeAtStartOfDay().getMillis() + DateTimeConstants.MILLIS_PER_DAY; } public MonthMetadata(final VisitedCity consensusVisitedCity, VisitedCity previousInferredCity, VisitedCity nextInferredCity, Map<String, TimeZone> consensusTimezones, TimezoneMap timezoneMap, List<VisitedCity> cities, List<VisitedCity> consensusCities, final int year, final int month) { super(consensusVisitedCity, previousInferredCity, nextInferredCity, consensusTimezones, timezoneMap, cities, consensusCities); // Calculate the calendar date at the beginning and end of this month. Store as startDate and endDate. final LocalDate beginningOfMonth = TimeUtils.getBeginningOfMonth(year, month); final LocalDate endOfMonth = TimeUtils.getEndOfMonth(year, month); this.startDate = TimeUtils.dateFormatter.print(beginningOfMonth); this.endDate = TimeUtils.dateFormatter.print(endOfMonth); final TimeZone startTz = consensusTimezones.get(this.startDate); final TimeZone endTz = consensusTimezones.get(this.endDate); // Finally, calculate start and and using the start and end timezones this.start = beginningOfMonth.toDateTimeAtStartOfDay(DateTimeZone.forTimeZone(startTz)).getMillis(); this.end = endOfMonth.toDateTimeAtStartOfDay(DateTimeZone.forTimeZone(endTz)).getMillis() + DateTimeConstants.MILLIS_PER_DAY; } public static long getEndOfMonth(String timeZone, final int year, final int month) { final DateTimeZone consensusTimezone = DateTimeZone.forID(timeZone); final LocalDate lastDayOfMonth = TimeUtils.getEndOfMonth(year, month); long t = lastDayOfMonth.toDateTimeAtStartOfDay(consensusTimezone).getMillis() + DateTimeConstants.MILLIS_PER_DAY; return t; } public static long getStartOfMonth(String timeZone, final int year, final int month) { final LocalDate firstDayOfMonth = TimeUtils.getBeginningOfMonth(year, month); final DateTimeZone consensusTimezone = DateTimeZone.forID(timeZone); final long t = firstDayOfMonth.toDateTimeAtStartOfDay(consensusTimezone).getMillis(); return t; } @Override protected TimeUnit getTimespanTimeUnit() { return TimeUnit.MONTH; } }