package com.cloudhopper.commons.util; /* * #%L * ch-commons-util * %% * Copyright (C) 2012 Cloudhopper by Twitter * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ // third party imports import org.junit.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; /** * * @author joelauer (twitter: @jjlauer or <a href="http://twitter.com/jjlauer" target=window>http://twitter.com/jjlauer</a>) */ public class DateTimeUtilTest { private static final Logger logger = LoggerFactory.getLogger(DateTimeUtilTest.class); @Test public void parseEmbedded() throws Exception { // parse just dates DateTime dt0 = DateTimeUtil.parseEmbedded("app-2009-06-24.log.gz", "yyyy-MM-dd", DateTimeZone.UTC); logger.debug("dt = " + dt0); Assert.assertEquals(new DateTime(2009,6,24,0,0,0,0,DateTimeZone.UTC), dt0); // parse a date and time dt0 = DateTimeUtil.parseEmbedded("app-2009-06-24-051112.log.gz", "yyyy-MM-dd-hhmmss", DateTimeZone.UTC); logger.debug("dt = " + dt0); Assert.assertEquals(new DateTime(2009,6,24,5,11,12,0,DateTimeZone.UTC), dt0); // parse different date format dt0 = DateTimeUtil.parseEmbedded("app-20090624-051112.log.gz", "yyyyMMdd-hhmmss", DateTimeZone.UTC); logger.debug("dt = " + dt0); Assert.assertEquals(new DateTime(2009,6,24,5,11,12,0,DateTimeZone.UTC), dt0); // parse just year and month dt0 = DateTimeUtil.parseEmbedded("app-200906.log.gz", "yyyyMM", DateTimeZone.UTC); logger.debug("dt = " + dt0); Assert.assertEquals(new DateTime(2009,6,1,0,0,0,0,DateTimeZone.UTC), dt0); try { // filename is missing a day dt0 = DateTimeUtil.parseEmbedded("app-200906.log.gz", "yyyyMMdd", DateTimeZone.UTC); Assert.fail("parse should have failed"); } catch (IllegalArgumentException e) { // correct behavior } try { // june only has 30 days dt0 = DateTimeUtil.parseEmbedded("app-20090631.log.gz", "yyyyMMdd", DateTimeZone.UTC); Assert.fail("parse should have failed"); } catch (IllegalArgumentException e) { // correct behavior } try { // tt isn't a valid pattern dt0 = DateTimeUtil.parseEmbedded("app-20090631.log.gz", "yyyyMMtt", DateTimeZone.UTC); Assert.fail("parse should have failed"); } catch (IllegalArgumentException e) { // correct behavior } } @Test(expected=IllegalArgumentException.class) public void parseEmbeddedThrowsException0() throws Exception { DateTimeUtil.parseEmbedded("app.2008-05-0.log"); } @Test(expected=IllegalArgumentException.class) public void parseEmbeddedThrowsException1() throws Exception { DateTimeUtil.parseEmbedded("app.2008-0-01.log"); } @Test(expected=IllegalArgumentException.class) public void parseEmbeddedThrowsException2() throws Exception { DateTimeUtil.parseEmbedded("app.208-05-01.log"); } /** @Test public void toMidnightUTCDateTime() throws Exception { // create a DateTime in the pacific timezone for June 24, 2009 at 11 PM DateTime dt = new DateTime(2009,6,24,23,30,30,0,DateTimeZone.forID("America/Los_Angeles")); logger.info("Local DateTime: " + dt); // just for making sure we're creating something interesting, let's // just convert this to UTC without using our utility function DateTime utcdt = dt.toDateTime(DateTimeZone.UTC); logger.info("DateTime -> UTC: " + utcdt); // convert this to be in the UTC timezone -- reset to midnight DateTime newdt = DateTimeUtil.toYearMonthDayUTC(dt); logger.debug("DateTime -> UTC (but with util): " + newdt); Assert.assertEquals(2009, newdt.getYear()); Assert.assertEquals(6, newdt.getMonthOfYear()); Assert.assertEquals(24, newdt.getDayOfMonth()); Assert.assertEquals(0, newdt.getHourOfDay()); Assert.assertEquals(0, newdt.getMinuteOfHour()); Assert.assertEquals(0, newdt.getSecondOfMinute()); Assert.assertEquals(0, newdt.getMillisOfSecond()); } */ @Test public void floorToYear() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest year // DateTime dt1 = DateTimeUtil.floorToYear(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(1, dt1.getMonthOfYear()); Assert.assertEquals(1, dt1.getDayOfMonth()); Assert.assertEquals(0, dt1.getHourOfDay()); Assert.assertEquals(0, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToYear(null); Assert.assertNull(dt2); } @Test public void floorToMonth() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest month // DateTime dt1 = DateTimeUtil.floorToMonth(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(1, dt1.getDayOfMonth()); Assert.assertEquals(0, dt1.getHourOfDay()); Assert.assertEquals(0, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToMonth(null); Assert.assertNull(dt2); } @Test public void floorToDay() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest day // DateTime dt1 = DateTimeUtil.floorToDay(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(0, dt1.getHourOfDay()); Assert.assertEquals(0, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToDay(null); Assert.assertNull(dt2); } @Test public void floorToHour() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest hour // DateTime dt1 = DateTimeUtil.floorToHour(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(0, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToHour(null); Assert.assertNull(dt2); } @Test public void floorToHalfHour() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,29,30,789,DateTimeZone.UTC); Assert.assertNull(DateTimeUtil.floorToHalfHour(null)); // floor to nearest half hour DateTime dt1 = DateTimeUtil.floorToHalfHour(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(0, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.UTC, dt1.getZone()); DateTime dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,0,0,0)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,1,23,456)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,30,12,56)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,59,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,55,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); dt3 = DateTimeUtil.floorToHalfHour(new DateTime(2009,6,24,10,46,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); } @Test public void floorToQuarterHour() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,29,30,789,DateTimeZone.UTC); Assert.assertNull(DateTimeUtil.floorToQuarterHour(null)); // floor to nearest half hour DateTime dt1 = DateTimeUtil.floorToQuarterHour(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(15, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.UTC, dt1.getZone()); DateTime dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,0,0,0)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,1,23,456)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,30,12,56)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,59,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,45,0,0), dt3); dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,55,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,45,0,0), dt3); dt3 = DateTimeUtil.floorToQuarterHour(new DateTime(2009,6,24,10,46,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,45,0,0), dt3); } @Test public void floorToTenMinutes() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,29,30,789,DateTimeZone.UTC); Assert.assertNull(DateTimeUtil.floorToTenMinutes(null)); // floor to nearest half hour DateTime dt1 = DateTimeUtil.floorToTenMinutes(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(20, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.UTC, dt1.getZone()); DateTime dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,0,0,0)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,1,23,456)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,30,12,56)); Assert.assertEquals(new DateTime(2009,6,24,10,30,0,0), dt3); dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,59,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,50,0,0), dt3); dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,55,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,50,0,0), dt3); dt3 = DateTimeUtil.floorToTenMinutes(new DateTime(2009,6,24,10,46,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,40,0,0), dt3); } @Test public void floorToFiveMinutes() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest five minutes // DateTime dt1 = DateTimeUtil.floorToFiveMinutes(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(30, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToFiveMinutes(null); Assert.assertNull(dt2); // // various tests since rounding five minutes is more complicated // DateTime dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,0,0,0)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,1,23,456)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,2,12,56)); Assert.assertEquals(new DateTime(2009,6,24,10,0,0,0), dt3); dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,59,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,55,0,0), dt3); dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,55,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,55,0,0), dt3); dt3 = DateTimeUtil.floorToFiveMinutes(new DateTime(2009,6,24,10,46,59,999)); Assert.assertEquals(new DateTime(2009,6,24,10,45,0,0), dt3); } @Test public void floorToMinute() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,30,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest minute // DateTime dt1 = DateTimeUtil.floorToMinute(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(30, dt1.getMinuteOfHour()); Assert.assertEquals(0, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToMinute(null); Assert.assertNull(dt2); } @Test public void floorToSecond() throws Exception { // create a reference datetime DateTime dt0 = new DateTime(2009,6,24,23,30,31,789,DateTimeZone.forID("America/Los_Angeles")); // // floor to nearest second // DateTime dt1 = DateTimeUtil.floorToSecond(dt0); Assert.assertEquals(2009, dt1.getYear()); Assert.assertEquals(6, dt1.getMonthOfYear()); Assert.assertEquals(24, dt1.getDayOfMonth()); Assert.assertEquals(23, dt1.getHourOfDay()); Assert.assertEquals(30, dt1.getMinuteOfHour()); Assert.assertEquals(31, dt1.getSecondOfMinute()); Assert.assertEquals(0, dt1.getMillisOfSecond()); Assert.assertEquals(DateTimeZone.forID("America/Los_Angeles"), dt1.getZone()); // // floor null // DateTime dt2 = DateTimeUtil.floorToSecond(null); Assert.assertNull(dt2); } }