| /* |
| ******************************************************************************* |
| * Copyright (C) 2007, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.util; |
| |
| import java.io.Serializable; |
| |
| /** |
| * <code>DateTimeRule</code> is a class representing a time in a year by |
| * a rule specified by month, day of month, day of week and |
| * time in the day. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public class DateTimeRule implements Serializable { |
| |
| private static final long serialVersionUID = 2183055795738051443L; |
| |
| /** |
| * Date rule type defined by exact day of month. |
| * For example, March 14. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int DOM = 0; |
| |
| /** |
| * Date rule type defined by day of week in month. |
| * For example, 2nd Sunday in March. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int DOW = 1; |
| |
| /** |
| * Date rule type defined by first day of week on or |
| * after exact day of month. |
| * For example, 1st Monday on or after March 15. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int DOW_GEQ_DOM = 2; |
| |
| /** |
| * Date rule type defined by last day of week on or |
| * before exact day of month. |
| * For example, last Saturday on or before March 15. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int DOW_LEQ_DOM = 3; |
| |
| /** |
| * Time rule type for local wall time. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int WALL_TIME = 0; |
| |
| /** |
| * Time rule type for local standard time. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int STANDARD_TIME = 1; |
| |
| /** |
| * Time rule type for coordinated universal time. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public static final int UTC_TIME = 2; |
| |
| // private stuff |
| private final int dateRuleType; |
| private final int month; |
| private final int dayOfMonth; |
| private final int dayOfWeek; |
| private final int weekInMonth; |
| |
| private final int timeRuleType; |
| private final int millisInDay; |
| |
| /** |
| * Constructs a <code>DateTimeRule</code> by the day of month and |
| * the time rule. The date rule type for an instance created by |
| * this constructor is <code>DOM</code>. |
| * |
| * @param month The rule month, for example, <code>Calendar.JANUARY</code> |
| * @param dayOfMonth The day of month, 1-based. |
| * @param millisInDay The milliseconds in the rule date. |
| * @param timeType The time type, <code>WALL_TIME</code> or <code>STANDARD_TIME</code> |
| * or <code>UTC_TIME</code>. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public DateTimeRule(int month, int dayOfMonth, |
| int millisInDay, int timeType) { |
| dateRuleType = DOM; |
| this.month = month; |
| this.dayOfMonth = dayOfMonth; |
| |
| this.millisInDay = millisInDay; |
| this.timeRuleType = timeType; |
| |
| // not used by this rule type |
| this.dayOfWeek = 0; |
| this.weekInMonth = 0; |
| } |
| |
| /** |
| * Constructs a <code>DateTimeRule</code> by the day of week and its oridinal |
| * number and the time rule. The date rule type for an instance created |
| * by this constructor is <code>DOW</code>. |
| * |
| * @param month The rule month, for example, <code>Calendar.JANUARY</code>. |
| * @param weekInMonth The ordinal number of the day of week. Negative number |
| * may be used for specifying a rule date counted from the |
| * end of the rule month. |
| * @param dayOfWeek The day of week, for example, <code>Calendar.SUNDAY</code>. |
| * @param millisInDay The milliseconds in the rule date. |
| * @param timeType The time type, <code>WALL_TIME</code> or <code>STANDARD_TIME</code> |
| * or <code>UTC_TIME</code>. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public DateTimeRule(int month, int weekInMonth, int dayOfWeek, |
| int millisInDay, int timeType) { |
| dateRuleType = DOW; |
| this.month = month; |
| this.weekInMonth = weekInMonth; |
| this.dayOfWeek = dayOfWeek; |
| |
| this.millisInDay = millisInDay; |
| this.timeRuleType = timeType; |
| |
| // not used by this rule type |
| this.dayOfMonth = 0; |
| } |
| |
| /** |
| * Constructs a <code>DateTimeRule</code> by the first/last day of week |
| * on or after/before the day of month and the time rule. The date rule |
| * type for an instance created by this constructor is either |
| * <code>DOM_GEQ_DOM</code> or <code>DOM_LEQ_DOM</code>. |
| * |
| * @param month The rule month, for example, <code>Calendar.JANUARY</code> |
| * @param dayOfMonth The day of month, 1-based. |
| * @param dayOfWeek The day of week, for example, <code>Calendar.SUNDAY</code>. |
| * @param after true if the rule date is on or after the day of month. |
| * @param millisInDay The milliseconds in the rule date. |
| * @param timeType The time type, <code>WALL_TIME</code> or <code>STANDARD_TIME</code> |
| * or <code>UTC_TIME</code>. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public DateTimeRule(int month, int dayOfMonth, int dayOfWeek, boolean after, |
| int millisInDay, int timeType) { |
| this.dateRuleType = after ? DOW_GEQ_DOM : DOW_LEQ_DOM; |
| this.month = month; |
| this.dayOfMonth = dayOfMonth; |
| this.dayOfWeek = dayOfWeek; |
| |
| this.millisInDay = millisInDay; |
| this.timeRuleType = timeType; |
| |
| // not used by this rule type |
| this.weekInMonth = 0; |
| } |
| |
| /** |
| * Gets the date rule type, such as <code>DOM</code> |
| * |
| * @return The date rule type. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getDateRuleType() { |
| return dateRuleType; |
| } |
| |
| /** |
| * Gets the rule month. |
| * |
| * @return The rule month. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getRuleMonth() { |
| return month; |
| } |
| |
| /** |
| * Gets the rule day of month. When the date rule type |
| * is <code>DOW</code>, the value is always 0. |
| * |
| * @return The rule day of month |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getRuleDayOfMonth() { |
| return dayOfMonth; |
| } |
| |
| /** |
| * Gets the rule day of week. When the date rule type |
| * is <code>DOM</code>, the value is always 0. |
| * |
| * @return The rule day of week. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getRuleDayOfWeek() { |
| return dayOfWeek; |
| } |
| |
| /** |
| * Gets the rule day of week ordinal number in the month. |
| * When the date rule type is not <code>DOW</code>, the value is |
| * always 0. |
| * |
| * @return The rule day of week ordinal number in the month. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getRuleWeekInMonth() { |
| return weekInMonth; |
| } |
| |
| /** |
| * Gets the time rule type |
| * |
| * @return The time rule type, either <code>WALL_TIME</code> or <code>STANDARD_TIME</code> |
| * or <code>UTC_TIME</code>. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getTimeRuleType() { |
| return timeRuleType; |
| } |
| |
| /** |
| * Gets the rule time in the rule day. |
| * |
| * @return The time in the rule day in milliseconds. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public int getRuleMillisInDay() { |
| return millisInDay; |
| } |
| |
| private static final String[] DOWSTR = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; |
| private static final String[] MONSTR = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; |
| |
| /** |
| * Returns a <code>String</code> representation of this <code>DateTimeRule</code> object. |
| * This method is used for debugging purpose only. The string representation can be changed |
| * in future version of ICU without any notice. |
| * |
| * @draft ICU 3.8 |
| * @provisional This API might change or be removed in a future release. |
| */ |
| public String toString() { |
| String sDate = null; |
| String sTimeRuleType = null; |
| |
| switch (dateRuleType) { |
| case DOM: |
| sDate = Integer.toString(dayOfMonth); |
| break; |
| case DOW: |
| sDate = Integer.toString(weekInMonth) + DOWSTR[dayOfWeek]; |
| break; |
| case DOW_GEQ_DOM: |
| sDate = DOWSTR[dayOfWeek] + ">=" + Integer.toString(dayOfMonth); |
| break; |
| case DOW_LEQ_DOM: |
| sDate = DOWSTR[dayOfWeek] + "<=" + Integer.toString(dayOfMonth); |
| break; |
| } |
| |
| switch (timeRuleType) { |
| case WALL_TIME: |
| sTimeRuleType = "WALL"; |
| break; |
| case STANDARD_TIME: |
| sTimeRuleType = "STD"; |
| break; |
| case UTC_TIME: |
| sTimeRuleType = "UTC"; |
| break; |
| } |
| |
| int time = millisInDay; |
| int millis = time % 1000; |
| time /= 1000; |
| int secs = time % 60; |
| time /= 60; |
| int mins = time % 60; |
| int hours = time / 60; |
| |
| StringBuffer buf = new StringBuffer(); |
| buf.append("month="); |
| buf.append(MONSTR[month]); |
| buf.append(", date="); |
| buf.append(sDate); |
| buf.append(", time="); |
| buf.append(hours); |
| buf.append(":"); |
| buf.append(mins/10); |
| buf.append(mins%10); |
| buf.append(":"); |
| buf.append(secs/10); |
| buf.append(secs%10); |
| buf.append("."); |
| buf.append(millis/100); |
| buf.append((millis/10)%10); |
| buf.append(millis%10); |
| buf.append("("); |
| buf.append(sTimeRuleType); |
| buf.append(")"); |
| return buf.toString(); |
| } |
| } |