// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.datetime; import org.junit.Test; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Random; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; public class TimeUtilTest { @Test public void testFromToJulian() { DateTimeStamp time; JulianDateStamp jds; time = TimeUtil.fromJulianDate(0.0); assertEquals("-4712-1-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(0.0, jds.doubleValue(), 1.0e-8); assertEquals(0, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(59.0); assertEquals("-4712-2-29 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(59.0, jds.doubleValue(), 1.0e-8); assertEquals(59, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(366.0); assertEquals("-4711-1-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(366.0, jds.doubleValue(), 1.0e-8); assertEquals(366, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(731.0); assertEquals("-4710-1-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(731.0, jds.doubleValue(), 1.0e-8); assertEquals(731, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721058.0); assertEquals("0-1-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721058.0, jds.doubleValue(), 1.0e-8); assertEquals(1721058, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721057.0); assertEquals("-1-12-31 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721057.0, jds.doubleValue(), 1.0e-8); assertEquals(1721057, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721117.0); assertEquals("0-2-29 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721117.0, jds.doubleValue(), 1.0e-8); assertEquals(1721117, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721118.0); assertEquals("0-3-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721118.0, jds.doubleValue(), 1.0e-8); assertEquals(1721118, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721423.0); assertEquals("0-12-31 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721423.0, jds.doubleValue(), 1.0e-8); assertEquals(1721423, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(1721424.0); assertEquals("1-1-1 12:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(1721424.0, jds.doubleValue(), 1.0e-8); assertEquals(1721424, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2440587.5); assertEquals("1970-1-1 0:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2440587.5, jds.doubleValue(), 1.0e-8); assertEquals(2440588, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2451774.726007); assertEquals("2000-8-18 5:25:27.4", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2451774.726007, jds.doubleValue(), 1.0e-8); assertEquals(2451775, jds.getJulianDayNumber()); DateTimeStamp time2 = TimeUtil.fromJulianDate(jds.doubleValue()); assertEquals(time2, time); time = TimeUtil.fromJulianDate(2451774.72600701); assertEquals("2000-8-18 5:25:27.5", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2451774.72600701, jds.doubleValue(), 1.0e-8); assertEquals(2451775, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2451774.72600702); assertEquals("2000-8-18 5:25:27.6", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2451774.72600702, jds.doubleValue(), 1.0e-8); assertEquals(2451775, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2299160.49998901); assertEquals("1582-10-4 23:59:59.50", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2299160.49998901, jds.doubleValue(), 1.0e-8); assertEquals(2299160, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2299160.5); assertEquals("1582-10-15 0:0:0.0", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2299160.5, jds.doubleValue(), 1.0e-8); assertEquals(2299161, jds.getJulianDayNumber()); time = TimeUtil.fromJulianDate(2147438064.499989); assertEquals("5874773-8-15 23:59:59.52", time.toString()); jds = TimeUtil.toJulianDate(time); assertEquals(2147438064.499989, jds.doubleValue(), 1.0e-8); assertEquals(2147438064, jds.getJulianDayNumber()); } @Test public void testFix() { DateTimeStamp t = new DateTimeStamp(); t.year = 2003; t.month = 7; t.day = 26; t.hour = 0; t.minute = 0; t.second = 2; double jd = TimeUtil.toJulianDate(t).doubleValue(); DateTimeStamp t2 = TimeUtil.fromJulianDate(jd); assertFalse(t.toString().equals(t2.toString())); JulianDateStamp jds = TimeUtil.toJulianDate(t); t2 = TimeUtil.fromJulianDate(jds); assertEquals(t.toString(), t2.toString()); } @Test public void testMonteCarlo() { Random r = new Random(); for (int i = 0; i < 5000000; i++) { double jd = r.nextFloat() * 3.0e6; DateTimeStamp t = TimeUtil.fromJulianDate(jd); JulianDateStamp jds = TimeUtil.toJulianDate(t); DateTimeStamp t2 = TimeUtil.fromJulianDate(jds); assertEquals(t, t2); } } @Test public void testDates() { DateTimeStamp t = new DateTimeStamp(); GregorianCalendar gc = new GregorianCalendar(); for (int y = 1970; y < 2100; y++) { gc.set(y, 0, 1); t.year = y; for (int i = 0; i < 365; i++) { t.month = gc.get(Calendar.MONTH) + 1; t.day = gc.get(Calendar.DAY_OF_MONTH); t.hour = t.minute = 0; t.second = 0; t.millisecond = 0; double jd = TimeUtil.toJulianDate(t).doubleValue(); DateTimeStamp t2 = TimeUtil.fromJulianDate(jd); assertEquals(t.toString(), t2.toString()); gc.add(Calendar.DAY_OF_YEAR, 1); } } } @Test public void testTimes() { DateTimeStamp t = new DateTimeStamp(); GregorianCalendar gc = new GregorianCalendar(); t.year = gc.get(Calendar.YEAR); gc.set(t.year, gc.get(Calendar.MONTH), gc.get(Calendar.DAY_OF_MONTH), 0, 0, 0); for (int day = 0; day < 1; day++) { t.month = gc.get(Calendar.MONTH) + 1; t.day = gc.get(Calendar.DAY_OF_MONTH); for (int i = 0; i < 86400; i++) { t.hour = gc.get(Calendar.HOUR_OF_DAY); t.minute = gc.get(Calendar.MINUTE); t.second = gc.get(Calendar.SECOND); JulianDateStamp jds = TimeUtil.toJulianDate(t); DateTimeStamp t2 = TimeUtil.fromJulianDate(jds); assertEquals(t.toString(), t2.toString()); gc.add(Calendar.SECOND, 1); } gc.add(Calendar.DAY_OF_YEAR, 1); } } @Test public void testDayOfYear() { int doy = TimeUtil.dayOfYear(2003, 1, 1); assertEquals(1, doy); doy = TimeUtil.dayOfYear(2003, 2, 1); assertEquals(32, doy); doy = TimeUtil.dayOfYear(2003, 12, 31); assertEquals(365, doy); doy = TimeUtil.dayOfYear(2004, 12, 31); assertEquals(366, doy); doy = TimeUtil.dayOfYear(2000, 12, 31); assertEquals(366, doy); } @Test public void testSetAccumulation() { DateTimeStamp gts1 = new DateTimeStamp(2003, 11, 24, 21, 40, 38, 173); DateTimeStamp gts2 = new DateTimeStamp(2003, 11, 24, 21, 40, 38, 173); assertEquals(0, gts1.compareTo(gts2)); assertEquals(0, gts2.compareTo(gts1)); for (int i = 0; i < 100; i++) { JulianDateStamp jds = TimeUtil.toJulianDate(gts2); gts2 = TimeUtil.fromJulianDate(jds); } assertEquals(0, gts1.compareTo(gts2)); assertEquals(0, gts2.compareTo(gts1)); } @Test public void testSetDateAccumulation() { DateTimeStamp gts1 = new DateTimeStamp(2003, 11, 24, 21, 40, 38, 173); DateTimeStamp gts2 = new DateTimeStamp(2003, 11, 24, 21, 40, 38, 173); assertEquals(0, gts1.compareTo(gts2)); assertEquals(0, gts2.compareTo(gts1)); for (int i = 0; i < 100; i++) { JulianDateStamp jds = TimeUtil.toJulianDate(2003, 11, 24, gts2.hour, gts2.minute, gts2.second, gts2.millisecond); gts2 = TimeUtil.fromJulianDate(jds); } assertEquals(0, gts1.compareTo(gts2)); assertEquals(0, gts2.compareTo(gts1)); } @Test public void testToCalendar() { assertEquals(Calendar.JANUARY, TimeUtil.toCalendarMonth(JDateTime.JANUARY)); assertEquals(Calendar.DECEMBER, TimeUtil.toCalendarMonth(JDateTime.DECEMBER)); assertEquals(Calendar.MONDAY, TimeUtil.toCalendarDayOfWeek(JDateTime.MONDAY)); assertEquals(Calendar.TUESDAY, TimeUtil.toCalendarDayOfWeek(JDateTime.TUESDAY)); assertEquals(Calendar.SATURDAY, TimeUtil.toCalendarDayOfWeek(JDateTime.SATURDAY)); assertEquals(Calendar.SUNDAY, TimeUtil.toCalendarDayOfWeek(JDateTime.SUNDAY)); } @Test public void testHttpTime() { long millis = System.currentTimeMillis(); millis = (millis / 1000) * 1000; String time = TimeUtil.formatHttpDate(millis); long millisBack = TimeUtil.parseHttpTime(time); assertEquals(millis, millisBack); } }