// 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.Assert; import org.junit.Test; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; public class JDateTimeMoreTest { @Test public void test1582() { JDateTime jdt1582 = new JDateTime(1582, 10, 4); assertEquals(4, jdt1582.getDayOfWeek()); jdt1582.addDay(1); assertEquals(1582, jdt1582.getYear()); assertEquals(10, jdt1582.getMonth()); assertEquals(15, jdt1582.getDay()); assertEquals(5, jdt1582.getDayOfWeek()); } @Test public void testCompareToAndAdd() { JDateTime gt1 = new JDateTime(); if (gt1.getDay() > 28) { // back and forth adds works without corrections gt1.setDay(28); // for days that exists in all months } // check for year 1582 if (gt1.getMonth() == 10) { if ((gt1.getDay() > 4) && ((gt1.getDay() < 15))) { gt1.setDay(4); } } JDateTime gt2 = gt1.clone(); assertEquals(0, gt1.compareTo(gt2)); for (int i = 1; i < 1000; i++) { gt2.add(i, 0, 0); assertEquals(-1, gt1.compareTo(gt2)); gt2.addYear(-2 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addYear(i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 60000; i++) { gt2.add(0, i, 0); assertEquals(-1, gt1.compareTo(gt2)); gt2.addMonth(-i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 5000; i++) { // Year 1582, months moving gt2.add(0, i, 0); // before it still doesn't work assertEquals(-1, gt1.compareTo(gt2)); gt2.addMonth(-2 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addMonth(i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 10000; i++) { gt2.add(0, 0, i); assertEquals(-1, gt1.compareTo(gt2)); gt2.addDay(-3 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addDay(2 * i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 100000; i++) { gt2.addTime(i, 0, 0, 0); assertEquals(-1, gt1.compareTo(gt2)); gt2.addHour(-4 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addHour(3 * i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 100000; i++) { gt2.addTime(0, i, 0, 0); assertEquals(-1, gt1.compareTo(gt2)); gt2.addMinute(-5 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addMinute(4 * i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 1000000; i++) { gt2.addTime(0, 0, i, 0); assertEquals(-1, gt1.compareTo(gt2)); gt2.addSecond(-7 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addSecond(6 * i); assertEquals(0, gt1.compareTo(gt2)); } for (int i = 1; i < 1000000; i++) { gt2.addTime(0, 0, 0, i); assertEquals(-1, gt1.compareTo(gt2)); gt2.addMillisecond(-8 * i); assertEquals(1, gt1.compareTo(gt2)); gt2.addMillisecond(7 * i); assertEquals(0, gt1.compareTo(gt2)); } } @Test public void testWeekOfYear() { JDateTime gt = new JDateTime(); GregorianCalendar gc = new GregorianCalendar(); int[] _fdiw = {0, GregorianCalendar.MONDAY, GregorianCalendar.TUESDAY, GregorianCalendar.WEDNESDAY, GregorianCalendar.THURSDAY, GregorianCalendar.FRIDAY, GregorianCalendar.SATURDAY, GregorianCalendar.SUNDAY}; // test all starting dates (first day in week) for (int fdiw = 1; fdiw <= 7; fdiw++) { gc.setFirstDayOfWeek(_fdiw[fdiw]); // test all minimal days in first week for (int min = 1; min <= 7; min++) { gc.setMinimalDaysInFirstWeek(min); gt.setWeekDefinitionAlt(fdiw, min); // test many years for (int y = 1800; y < 3000; y++) { if (y == 1916) { continue; // skip this year due to specific daylight savings } gt.set(y, 1, 1); gc.set(y, 0, 1); int total = gt.isLeapYear() ? 366 : 365; // test all days for (int i = 0; i < total; i++) { assertEquals(gc.get(GregorianCalendar.DAY_OF_MONTH), gt.getDay()); assertEquals(gc.get(GregorianCalendar.MONTH) + 1, gt.getMonth()); assertEquals(gc.get(GregorianCalendar.YEAR), gt.getYear()); assertEquals(gc.get(GregorianCalendar.DAY_OF_YEAR), gt.getDayOfYear()); int dow = gc.get(GregorianCalendar.DAY_OF_WEEK) - 1; if (dow == 0) { dow = 7; } assertEquals(dow, gt.getDayOfWeek()); assertEquals(gc.get(GregorianCalendar.WEEK_OF_YEAR), gt.getWeekOfYear()); assertEquals(gc.get(GregorianCalendar.WEEK_OF_MONTH), gt.getWeekOfMonth()); gt.addDay(1); gc.roll(GregorianCalendar.DAY_OF_YEAR, true); } } } } } // ---------------------------------------------------------------- specific problems @Test public void testMillisProblems() { GregorianCalendar gc = new GregorianCalendar(); JDateTime jdt = new JDateTime(); long now = 1183243766625L; gc.setTimeInMillis(now); jdt.setTimeInMillis(now); assertEquals(now, jdt.getTimeInMillis()); assertEquals(now, jdt.getTimeInMillis()); JDateTime jdt2 = new JDateTime(); jdt2.setTimeInMillis(jdt.getTimeInMillis()); assertEquals(jdt.toString(), jdt2.toString()); assertEquals(gc.getTimeInMillis(), jdt2.getTimeInMillis()); assertEquals(now, jdt2.getTimeInMillis()); int year = 1970; jdt.setYear(year); jdt.setMillisecond(0); gc.set(Calendar.YEAR, year); gc.set(Calendar.MILLISECOND, 0); int month = 1; jdt.setMonth(month); gc.set(Calendar.MONTH, month - 1); for (int sec = 0; sec < 60; sec++) { jdt.setSecond(sec); gc.set(Calendar.SECOND, sec); assertEquals(gc.getTimeInMillis(), jdt.getTimeInMillis()); jdt.setTimeInMillis(gc.getTimeInMillis()); gc.setTimeInMillis(gc.getTimeInMillis()); assertEquals(gc.getTimeInMillis(), jdt.getTimeInMillis()); } } @Test public void test1() { DateTimeStamp dts = new DateTimeStamp(-2310, 3, 24, 7, 6, 16, 171); JDateTime jdt = new JDateTime(dts); DateTimeStamp dts2 = jdt.getDateTimeStamp(); assertNotSame(dts, dts2); assertEquals(dts, dts2); DateTimeStamp dts3 = TimeUtil.fromJulianDate(TimeUtil.toJulianDate(dts)); assertNotSame(dts, dts3); assertEquals(dts, dts3); } @Test public void testCtor() { JDateTime jdt = new JDateTime("2011-04-01 12:32:22.123"); assertEquals(2011, jdt.getYear()); assertEquals(4, jdt.getMonth()); assertEquals(1, jdt.getDay()); assertEquals(12, jdt.getHour()); assertEquals(32, jdt.getMinute()); assertEquals(22, jdt.getSecond()); assertEquals(123, jdt.getMillisecond()); jdt = new JDateTime("01.04.2011/12-32*22+123", "DD.MM.YYYY/hh-mm*ss+mss"); assertEquals(2011, jdt.getYear()); assertEquals(4, jdt.getMonth()); assertEquals(1, jdt.getDay()); assertEquals(12, jdt.getHour()); assertEquals(32, jdt.getMinute()); assertEquals(22, jdt.getSecond()); assertEquals(123, jdt.getMillisecond()); } @Test public void testMillis0() { JDateTime jdt = new JDateTime(0); GregorianCalendar gc = new GregorianCalendar(); gc.setTimeInMillis(0); assertEquals(gc.get(Calendar.HOUR), jdt.getHour()); } // ---------------------------------------------------------------- additional @Test public void testAddMonthNoFix() { JDateTime jdt; // January, no fix jdt = new JDateTime("2010-01-31"); jdt.addMonth(1, false); assertEquals("2010-03-03", jdt.toString("YYYY-MM-DD")); jdt.subMonth(1, false); assertEquals("2010-02-03", jdt.toString("YYYY-MM-DD")); // January, fix jdt = new JDateTime("2010-01-31"); jdt.addMonth(1); assertEquals("2010-02-28", jdt.toString("YYYY-MM-DD")); jdt.subMonth(1); assertEquals("2010-01-28", jdt.toString("YYYY-MM-DD")); // January, fix, Gregorian calendar GregorianCalendar gc = new GregorianCalendar(2010, 0, 31); gc.add(Calendar.MONTH, 1); assertEquals(1, gc.get(Calendar.MONTH)); assertEquals(28, gc.get(Calendar.DAY_OF_MONTH)); gc.add(Calendar.MONTH, -1); assertEquals(0, gc.get(Calendar.MONTH)); assertEquals(28, gc.get(Calendar.DAY_OF_MONTH)); // days, no month fix jdt = new JDateTime("2010-01-31"); jdt.addDay(31, false); assertEquals("2010-03-03", jdt.toString("YYYY-MM-DD")); jdt.subDay(31, false); assertEquals("2010-01-31", jdt.toString("YYYY-MM-DD")); jdt = new JDateTime("2010-01-31"); jdt.addDay(31); assertEquals("2010-03-03", jdt.toString("YYYY-MM-DD")); jdt.subDay(31); assertEquals("2010-01-31", jdt.toString("YYYY-MM-DD")); // March jdt = new JDateTime("2010-03-31"); jdt.addMonth(1, false); assertEquals("2010-05-01", jdt.toString("YYYY-MM-DD")); jdt.subMonth(1, false); assertEquals("2010-04-01", jdt.toString("YYYY-MM-DD")); jdt = new JDateTime("2010-03-31"); jdt.addMonth(1); assertEquals("2010-04-30", jdt.toString("YYYY-MM-DD")); jdt.subMonth(1); assertEquals("2010-03-30", jdt.toString("YYYY-MM-DD")); } @Test public void testWeeks() { JDateTime jdt = new JDateTime(2011, 1, 1); assertEquals(0, jdt.getWeekOfMonth()); // in previous year! assertEquals(52, jdt.getWeekOfYear()); // in previous year! jdt.setDate(2011, 1, 2); assertEquals(0, jdt.getWeekOfMonth()); // in previous year! assertEquals(52, jdt.getWeekOfYear()); // in previous year! jdt.setDate(2011, 1, 3); assertEquals(JDateTime.MONDAY, jdt.getDayOfWeek()); assertEquals(1, jdt.getWeekOfMonth()); assertEquals(1, jdt.getWeekOfYear()); jdt.setDate(2011, 1, 9); assertEquals(1, jdt.getWeekOfMonth()); assertEquals(1, jdt.getWeekOfYear()); jdt.setDate(2011, 1, 10); assertEquals(2, jdt.getWeekOfMonth()); assertEquals(2, jdt.getWeekOfYear()); jdt.setDate(2011, 1, 30); assertEquals(4, jdt.getWeekOfMonth()); assertEquals(4, jdt.getWeekOfYear()); jdt.setDate(2011, 1, 31); assertEquals(5, jdt.getWeekOfMonth()); // ? assertEquals(5, jdt.getWeekOfYear()); jdt.setDate(2011, 2, 1); assertEquals(1, jdt.getWeekOfMonth()); assertEquals(5, jdt.getWeekOfYear()); jdt.setDate(2011, 3, 27); assertEquals(4, jdt.getWeekOfMonth()); assertEquals(12, jdt.getWeekOfYear()); jdt.setDate(2011, 12, 31); assertEquals(52, jdt.getWeekOfYear()); jdt.setDate(2012, 1, 1); assertEquals(52, jdt.getWeekOfYear()); } @Test public void testNow() { long time = System.currentTimeMillis(); JDateTime jdt = new JDateTime(time); assertEquals(time, jdt.getTimeInMillis()); } @Test public void testMillisPrecision() { JDateTimeDefault.timeZone = TimeZone.getTimeZone("CET"); JDateTime jdt = new JDateTime(new JulianDateStamp(2456223, 0.42596945)); JDateTime jdt0 = new JDateTime(1350936803760L); JDateTime jdt1 = new JDateTime(2012, 10, 22, 22, 13, 23, 760); Assert.assertEquals(1350936803760L, jdt1.getTimeInMillis()); Assert.assertEquals(1350936803760L, jdt0.getTimeInMillis()); Assert.assertEquals(1350936803760L, jdt.getTimeInMillis()); assertEquals(42596945, jdt.getJulianDate().getSignificantFraction()); assertEquals(42596944, jdt0.getJulianDate().getSignificantFraction()); assertEquals(42596944, jdt1.getJulianDate().getSignificantFraction()); Assert.assertEquals(jdt0, jdt1); Assert.assertEquals(jdt, jdt0); Assert.assertEquals(jdt, jdt1); JDateTimeDefault.timeZone = null; } }