Hi all,

I was recently had a requirement where I needed to determine if a day was a
LONG, SHORT or NORMAL day,
& I wondered if it would be a useful addition to Joda-Time.

I have written it up here -
http://billcomer.blogspot.co.uk/2012/11/clock-changing-is-this-long-short-or.html

But here it is as well.

public enum ClockChangeInfo {

  LONG_DAY(90000000, 25), SHORT_DAY(82800000, 23), NORMAL_DAY(86400000,
24), INDETERMINATE(0, 0);

  private int mMsecs;
  private int mHrs;
  private static final Map<Integer, ClockChangeInfo> MSEC = new
HashMap<Integer, ClockChangeInfo>();

  static {
    for (ClockChangeInfo cci : values()) {
      MSEC.put(new Integer(cci.mMsecs), cci);
    }
  }

  ClockChangeInfo(int aMsecs, int aHrs) {
    mMsecs = aMsecs;
    mHrs = aHrs;
  }

  public int getHrs(ClockChangeInfo aCci)  {
    return aCci.mHrs;
  }

  public static ClockChangeInfo getDayType(DateMidnight dateToCheck) {
    DateMidnight nextDay = dateToCheck.plusDays(1);

    //this is a safe convert as it is only for day(n) - day(n-1)
    Integer millis = (int)(nextDay.getMillis() - dateToCheck.getMillis());
    ClockChangeInfo cci = MSEC.get(millis);
    if (cci == null) {
      return INDETERMINATE;
    }
    return cci;
  }
}

public class ClockChangeUtil {

  public static ClockChangeInfo getDayType(DateMidnight dateToCheck) {
    return ClockChangeInfo.getDayType((dateToCheck));
  }

  public static int getNumHoursInDay(DateMidnight dateToCheck) {
    ClockChangeInfo dayType = ClockChangeUtil.getDayType(dateToCheck);
    return dayType.getHrs(dayType);
  }

  public static int getNumHalfHoursINMonthSoFar(DateMidnight dateToCheck) {
    int numHours = 0;
    int day = dateToCheck.getDayOfMonth();

    if (day == 1) {
      return 0;
    }

    DateMidnight dm = dateToCheck.minusDays(1);

    do {
      numHours += getNumHoursInDay(dm);

      dm = dm.minusDays(1);
      day--;
    } while (day > 1);

    return numHours * 2;
  }
}


& some tests

public class ClockChangeUtilUnitTest
{

  @Test
  public void test_isLongDay() throws Exception
  {
    DateMidnight dm28 = new DateMidnight(2011, 10, 28);
    DateMidnight dm29 = new DateMidnight(2011, 10, 29);
    DateMidnight dm30 = new DateMidnight(2011, 10, 30);
    DateMidnight dm31 = new DateMidnight(2011, 10, 31);

    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm28));
    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm29));
    assertEquals(ClockChangeInfo.LONG_DAY,
ClockChangeUtil.getDayType(dm30));
    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm31));
  }


  @Test
  public void test_isShortDay() throws Exception
  {
    DateMidnight dm26 = new DateMidnight(2011, 3, 26);
    DateMidnight dm27 = new DateMidnight(2011, 3, 27);
    DateMidnight dm28 = new DateMidnight(2011, 3, 28);
    DateMidnight dm29 = new DateMidnight(2011, 3, 29);

    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm26));
    assertEquals(ClockChangeInfo.SHORT_DAY,
ClockChangeUtil.getDayType(dm27));
    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm28));
    assertEquals(ClockChangeInfo.NORMAL_DAY,
ClockChangeUtil.getDayType(dm29));
  }


  @Test
  public void testClockChange() throws Exception
  {
    long millisInANormalDay = 24 * 60 * 60 * 1000;
    long millisInALongDay = 25 * 60 * 60 * 1000;

    DateMidnight dm28 = new DateMidnight(2011, 10, 28);
    DateMidnight dm29 = new DateMidnight(2011, 10, 29);
    DateMidnight dm30 = new DateMidnight(2011, 10, 30);
    DateMidnight dm31 = new DateMidnight(2011, 10, 31);

    assertEquals(millisInANormalDay, dm29.getMillis() - dm28.getMillis());
    assertEquals(millisInANormalDay, dm30.getMillis() - dm29.getMillis());
    assertEquals(millisInALongDay, dm31.getMillis() - dm30.getMillis());


    DateTime dt28 = new DateTime(dm28);
    DateTime dt29 = new DateTime(dm29);
    DateTime dt30 = new DateTime(dm30);
    DateTime dt31 = new DateTime(dm31);

    assertEquals(millisInANormalDay, dt29.getMillis() - dt28.getMillis());
    assertEquals(millisInANormalDay, dt30.getMillis() - dt29.getMillis());
    assertEquals(millisInALongDay, dt31.getMillis() - dt30.getMillis());

    assertTrue(dt28.getZone().equals(dt29.getZone()));
    assertTrue(dt28.getZone().equals(dt30.getZone()));
    assertTrue(dt28.getZone().equals(dt31.getZone()));
  }

  @Test
  public void test_getNumHoursInDay() throws Exception
  {

    DateMidnight dm26 = new DateMidnight(2011, 3, 26);
    DateMidnight dm27 = new DateMidnight(2011, 3, 27);
    DateMidnight dm28 = new DateMidnight(2011, 3, 28);
    DateMidnight dm29 = new DateMidnight(2011, 3, 29);

    assertEquals(24, ClockChangeUtil.getNumHoursInDay(dm26));
    assertEquals(23, ClockChangeUtil.getNumHoursInDay(dm27));
    assertEquals(24, ClockChangeUtil.getNumHoursInDay(dm28));
    assertEquals(24, ClockChangeUtil.getNumHoursInDay(dm29));
  }

}
------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
Joda-interest mailing list
Joda-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/joda-interest

Reply via email to