/* * Copyright 2010, NTT DOCOMO,INC. * * 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. */ package jp.co.nttdocomo.star.util; import java.util.Calendar; import java.util.Date; /** * ���t��񑀍샆�[�e�B���e�B�[�N���X�ł��B<BR> * ���t�����Z�ADate���當����A�����񂩂�Date�̑���E�ϊ����s���܂��B<BR> * @since utilib-1.0 */ public class DateUtils { /** * ���t������ : �N */ public static final int YEAR = Calendar.YEAR; /** * ���t������ : �� */ public static final int MONTH = Calendar.MONTH; /** * ���t������ : �� */ public static final int DATE = Calendar.DATE; /** * ���t������ : �� (12���Ԑ�) */ public static final int HOUR = Calendar.HOUR; /** * ���t������ : �� (24���Ԑ�) */ public static final int HOUR_OF_DAY = Calendar.HOUR_OF_DAY; /** * ���t������ : �� */ public static final int MINUTE = Calendar.MINUTE; /** * ���t������ : �b */ public static final int SECOND = Calendar.SECOND; /** * ���t������ : �~���b */ public static final int MILLISECOND = Calendar.MILLISECOND; /** * ���P�[�V���� : �p�� */ public static final int ENGLISH = 0; /** * ���P�[�V���� : ���{�� */ public static final int JAPANESE = 1; /** * �ϊ��p�萔 : �~���b �� �b �܂��� �b �� �~���b */ private static final int CONVERT_MILLIS_TO_SECONDS = 1000; /** * �ϊ��p�萔 : �� �� �b �܂��� �b �� �� */ private static final int CONVERT_SECONDS_TO_MINUTES = 60; /** * �ϊ��p�萔 : �� �� �� �܂��� �� �� �� */ private static final int CONVERT_MINUTES_TO_HOURS = 60; /** * �ϊ��p�萔 : �b �� �� �܂��� �� �� �b */ private static final int CONVERT_SECONDS_TO_HOURS = CONVERT_MINUTES_TO_HOURS * CONVERT_SECONDS_TO_MINUTES; /** * �^�C���]�[���ϊ��p�萔 */ private static final int CONVERT_TIMEZONE = 100; /** * �^�C���]�[���I�t�Z�b�g�̎��ԕϊ��p�萔 * (+0900 �̂悤�ɐ��l�������\�������悤�ϊ�����) */ private static final int CONVERT_TIMEZONE_RAW_OFFSET_TO_HOUR = CONVERT_SECONDS_TO_HOURS * CONVERT_MILLIS_TO_SECONDS / CONVERT_TIMEZONE; /** * ���t�t�H�[�}�b�g�g�[�N�� */ private static final char[] FORMAT_DATE_TIMES = { // �N (3�����ȏ�̏ꍇ��4���N�A2�����ȉ��̏ꍇ��2���N�ƂȂ�) 'y', // �� 'M', // ���ɂ������ 'd', // �j�� 'E', // ����ɂ����鎞 (0 - 23) 'H', // �ߑO / �ߌ�̎� (0 - 11) 'K', // �� 'm', // �b 's', // �~���b 'S', // RFC 822�`���^�C���]�[�� 'Z', }; /** * ���t��؂�g�[�N��<br> * <br> * ���t�̋�؂蕶�����`����B<br> */ private static final char[] SPLIT_TOKENS = { // �n�C�t�� '-', // �X���b�V�� '/', // �s���I�h '.', // �N '�N', // �� '��', // �� '��', // �� ':', // ���p�X�y�[�X ' ', }; /** * �j�����ꗗ<br> * <br> * Java��Calendar�N���X�̗j�����萔�l���ɔz�u���� */ private static final String[][] WEEK_NAMES_ALL = { // �p�� { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", }, // ���{�� { "���j��", "���j��", "�Ηj��", "���j��", "�ؗj��", "���j��", "�y�j��", }, }; /** * �C���X�^���X�����h�~�B * */ private DateUtils() { // �����Ȃ� } /** * <p>�w����t�ɑ΂��ē��t�����ʂ̒l�����Z���܂��B<br/> * �}�C�i�X�l���w�肵���ꍇ�͌��Z����܂��B</p> * * <p>type�ɂ͈ȉ��̒萔���w��”\�ł��B<br/> * DateUtils.YEAR<br/> * DateUtils.MONTH<br/> * DateUtils.DATE<br/> * DateUtils.HOUR<br/> * DateUtils.HOUR_OF_DAY<br/> * DateUtils.MINUTE<br/> * DateUtils.SECOND<br/> * DateUtils.MILLISECOND</p> * * @param date ���Z����t�f�[�^ * @param type ���Z������ * @param value ���Z����l * @return ���Z��̓��t�f�[�^ */ public static Date addDate( final Date date, final int type, final int value) { // ������ null �̏ꍇ�͗�O if (date == null) { throw new IllegalArgumentException(); } final Calendar cal = Calendar.getInstance(); // ���t����p�C���X�^���X // ���t�f�[�^��ݒ肷�� cal.setTime(date); // �w���ʂŒl�����Z���� switch (type) { case HOUR_OF_DAY: cal.setTime( new Date( cal.getTime().getTime() + ( value * 3600000L ) ) ); break; case HOUR: cal.setTime( new Date( cal.getTime().getTime() + ( value * 3600000L ) ) ); break; case MINUTE: cal.setTime( new Date( cal.getTime().getTime() + ( value * 60000L ) ) ); break; case SECOND: cal.setTime( new Date( cal.getTime().getTime() + ( value * 1000L ) ) ); break; case MILLISECOND: cal.setTime( new Date( cal.getTime().getTime() + ( value ) ) ); break; default: cal.set(type, cal.get(type) + value); break; } // ���t�f�[�^��Ԃ� return cal.getTime(); } /** * <p>�w����t�ɑ΂��ē��t�����ʂ̒l�����Z���܂��B<br/> * �}�C�i�X�l���w�肵���ꍇ�͌��Z����܂��B</p> * * <p>type�ɂ͈ȉ��̒萔���w��”\�ł��B<br/> * DateUtils.YEAR<br/> * DateUtils.MONTH<br/> * DateUtils.DATE<br/> * DateUtils.HOUR<br/> * DateUtils.HOUR_OF_DAY<br/> * DateUtils.MINUTE<br/> * DateUtils.SECOND<br/> * DateUtils.MILLISECOND</p> * * @param date ���Z����t�f�[�^ * @param type ���Z������ * @param value ���Z����l * @return ���Z��̓��t�f�[�^ */ public static long addDate( final long date, final int type, final int value) { return addDate(new Date(date), type, value).getTime(); } /** * �w��N���̓������擾���܂��B * * @param year �w�肷��N * @param month �w�肷�錎 (1 - 12) * @return �w�肳�ꂽ�N���̓��� * @exception IllegalArgumentException * ���w�肪�s���ȏꍇ�ɔ������܂��B */ public static int getDateCount( final int year, final int month) { if (month < 1 || 12 < month) { throw new IllegalArgumentException(); } final Calendar cal = Calendar.getInstance(); // ���t����p�C���X���^���X // �w�肳�ꂽ�N����ݒ肷�� // (���͓��t�����擾�p�Ɏ������w�肷�邽�߂��̂܂܎w�肷��) cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DATE, 0); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.MILLISECOND, 0); // �w��N���̓�����Ԃ� return cal.get(Calendar.DATE); } /** * �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\��������������擾���܂��B<br> * <br> * ���P�[���̓f�t�H���g�ł�(�p��j���g�p����܂�<br> * * @param format �t�H�[�}�b�g������ * @param date ���� * @return �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\������������ * @exception IllegalArgumentException * �t�H�[�}�b�g�����񂪕s���ȏꍇ�ɔ������܂��B */ public static String format( final String format, final Date date) { // ������ null �̏ꍇ�͗�O if (date == null) { throw new IllegalArgumentException(); } // �w��t�H�[�}�b�g�̓��t�������Ԃ� return format(format, date.getTime()); } /** * �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\��������������擾���܂��B<br> * <br> * ���P�[���̓f�t�H���g�ł�(�p��j���g�p����܂�<br> * * @param format �t�H�[�}�b�g������ * @param date ���� * @return �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\������������ * @exception IllegalArgumentException * �t�H�[�}�b�g�����񂪕s���ȏꍇ�ɔ������܂��B */ public static String format( final String format, final long date) { // �w��t�H�[�}�b�g�̓��t�������Ԃ� return format(format, date, ENGLISH); } /** * �w��t�H�[�}�b�g�A���P�[���Ŏw����t�f�[�^��\��������������擾���܂��B<br> * * @param format �t�H�[�}�b�g������ * @param date ���� * @param localeType ���P�[��(DateUtils.ENGLISH / DateUtils.JAPANESE) * @return �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\������������ * @exception IllegalArgumentException * �t�H�[�}�b�g�����񂪕s���ȏꍇ�ɔ������܂��B */ public static String format( final String format, final Date date, final int localeType) { // ������ null �̏ꍇ�͗�O if (date == null) { throw new IllegalArgumentException(); } // �w��t�H�[�}�b�g�̓��t�������Ԃ� return format(format, date.getTime(), localeType); } /** * �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\��������������擾���܂��B<br> * * @param format �t�H�[�}�b�g������ * @param time ���� * @param localeType ���P�[��(DateUtils.ENGLISH / DateUtils.JAPANESE) * @return �w��t�H�[�}�b�g�Ŏw����t�f�[�^��\������������ * @exception IllegalArgumentException * �t�H�[�}�b�g�����񂪕s���ȏꍇ�ɔ������܂��B */ public static String format( final String format, final long time, final int localeType) { // ������ null �̏ꍇ�͗�O if ((format == null)) { throw new IllegalArgumentException(); } final StringBuffer retBuf = new StringBuffer(); // �ԋp���t������o�b�t�@ final Calendar cal = Calendar.getInstance(); // ���t�Z�o�p�J�����_�[ int indexFormat = 0; // �t�H�[�}�b�g�����񌟍��ʒu // ������ݒ肷�� cal.setTime(new Date(time)); // ������I�[�܂Ń��[�v while (indexFormat < format.length()) { final char nowChar = format.charAt(indexFormat); // ���݈ʒu�̕��� // ���t�t�H�[�}�b�g�g�[�N���ȊO�̏ꍇ if (!isDateFormatToken(nowChar)) { // ���݂̕�����ԋp���t������o�b�t�@�֒lj����� retBuf.append(nowChar); // ���̕����� indexFormat++; continue; } int tokenCount = 1; // �g�[�N���� // �������t�t�H�[�}�b�g�g�[�N�����A�����Ă�������擾���� for (int i = indexFormat + 1; i < format.length(); i++, tokenCount++) { // �Ⴄ�����̏ꍇ if (format.charAt(i) != nowChar) { // ���[�v���f break; } } final int digitYearStr = 3; // ������\�L�ɂȂ錅�� final int digitRFC822 = 4; // RFC822�^�C���]�[���̌��� int tempValue; // ��Ɨp���l // �g�[�N���ʏ��� switch (nowChar) { // �N case 'y': // ������ 3 ���ȏ�̏ꍇ if (tokenCount >= digitYearStr) { // �ԋp������o�b�t�@�֔N4����lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.YEAR)), tokenCount)); } else { // �ԋp������o�b�t�@�֔N2����lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.YEAR)).substring( 2), tokenCount)); } break; // �� case 'M': // �ԋp������o�b�t�@�֌��̐��l�\����lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.MONTH) + 1), tokenCount)); break; // ���ɂ������ case 'd': // �ԋp������o�b�t�@�֌��ɂ��������lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.DAY_OF_MONTH)), tokenCount)); break; // �j�� case 'E': // �ԋp������o�b�t�@�֗j������lj����� retBuf.append(WEEK_NAMES_ALL[localeType][cal.get(Calendar.DAY_OF_WEEK) - 1].substring( 0, WEEK_NAMES_ALL[localeType][cal.get(Calendar.DAY_OF_WEEK) - 1].length())); break; // ����ɂ����鎞 (0 - 23) case 'H': // �ԋp������o�b�t�@�ֈ���ɂ����鎞 (0 - 23)��lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.HOUR_OF_DAY)), tokenCount)); break; // ����ɂ����鎞 (0 - 11) case 'K': // �ԋp������o�b�t�@�ֈ���ɂ����鎞 (0 - 11)��lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.HOUR)), tokenCount)); break; // �� case 'm': // �ԋp������o�b�t�@�֕���lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.MINUTE)), tokenCount)); break; // �b case 's': // �ԋp������o�b�t�@�֕b��lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.SECOND)), tokenCount)); break; // �~���b case 'S': // �ԋp������o�b�t�@�փ~���b��lj����� retBuf.append(appendPadding( String.valueOf(cal.get(Calendar.MILLISECOND)), tokenCount)); break; // RFC 822�`���^�C���]�[�� case 'Z': // �^�C���]�[���I�t�Z�b�g�l���Z�o���܂� tempValue = cal.getTimeZone().getRawOffset() / CONVERT_TIMEZONE_RAW_OFFSET_TO_HOUR; // �ԋp������o�b�t�@�փ^�C���]�[���I�t�Z�b�g��lj����܂� retBuf.append(appendPadding( String.valueOf(tempValue), digitRFC822, tempValue < 0 ? '-' : '+')); break; // �G���[ default: throw new IllegalArgumentException(); } // �t�H�[�}�b�g�����񌟍��ʒu�Ɠ��̓e�L�X�g�����ʒu���ړ����܂� indexFormat += tokenCount; } // �쐬�����������ԋp���܂� return retBuf.toString(); } /** * �w��t�H�[�}�b�g�Ŏw��e�L�X�g���p�[�X�������t���擾���܂��B * * @param format �t�H�[�}�b�g������ * @param text �p�[�X���܂������� * @return �p�[�X�������t * @exception IllegalArgumentException * �t�H�[�}�b�g�����񂪕s���ȏꍇ�ɔ������܂��B */ public static Date parse( final String format, final String text) { // ������ null �̏ꍇ�͗�O if ((format == null) || (text == null)) { throw new IllegalArgumentException(); } final StringBuffer textBuf = new StringBuffer(text); // �p�[�X������ҏW�o�b�t�@ final String editText; // �ҏW��e�L�X�g int index = 0; // �ҏW�p�C���f�b�N�X // �p�[�X������̕��������������܂� while (index < textBuf.length()) { // ��؂蕶���ȊO�̏ꍇ if (!isDateSplitToken(textBuf.charAt(index))) { // ���̕����� index++; continue; } // ���݈ʒu�̕������폜���܂� textBuf.deleteCharAt(index); } // �ҏW��̃e�L�X�g���擾���܂� editText = textBuf.toString(); // ���l�ȊO�̕����񂪂���ꍇ�͎��s if (!StringUtils.isDigit(editText)) { throw new IllegalArgumentException( "�p�[�X�Ώە�����ɐ��l�Ƌ�؂蕶���ȊO�̕������܂܂�Ă��܂� [text = " + text + "]"); } final Calendar retCal = Calendar.getInstance(); // �ԋp���t�Z�o�p�J�����_�[ int indexFormat = 0; // �t�H�[�}�b�g�����񌟍��ʒu int indexText = 0; // ���̓e�L�X�g�����ʒu // �J�����_�[�̓��t���N���A���܂� clearCalendar(retCal); // ������I�[�܂Ń��[�v while ((indexFormat < format.length()) && (indexText < editText.length())) { final char nowChar = format.charAt(indexFormat); // ���݈ʒu�̕��� // ���t�t�H�[�}�b�g�g�[�N���ȊO�̏ꍇ if (!isDateFormatToken(nowChar)) { // ���̕����� indexFormat++; continue; } int tokenCount = 1; // �g�[�N���� // �������t�t�H�[�}�b�g�g�[�N�����A�����Ă�������擾���܂� for (int i = indexFormat + 1; i < format.length(); i++, tokenCount++) { // �Ⴄ�����̏ꍇ if (format.charAt(i) != nowChar) { // ���[�v���f break; } } // �Z�o�p�萔��ݒ肵�܂� final int digitYearHalf = 2; // ������̔��� final int yearThousand = 1000; // ����؎̗p int value = 0; try { // int�l��Ԃ� value = Integer.parseInt(editText.substring( indexText, indexText + tokenCount)); } catch (final NumberFormatException e) { // �f�t�H���g�l��ݒ� value = 0; } // �g�[�N���ʏ��� switch (nowChar) { // �N case 'y': // ����������̔����ȉ��̏ꍇ if (tokenCount <= digitYearHalf) { final Calendar localCal = Calendar.getInstance(); final int year; // ������Z�o���܂� year = (localCal.get(Calendar.YEAR) / yearThousand * yearThousand) + value; // �ԋp���t�ɔN��ݒ肵�܂� retCal.set(Calendar.YEAR, year); } else { // �ԋp���t�ɔN��ݒ肵�܂� retCal.set(Calendar.YEAR, value); } break; // �� case 'M': // �ԋp���t�Ɍ���ݒ肵�܂� retCal.set(Calendar.MONTH, value - 1); break; // ���ɂ������ case 'd': // �ԋp���t�Ɍ��ɂ��������ݒ肵�܂� retCal.set(Calendar.DAY_OF_MONTH, value); break; // ����ɂ����鎞 (0 - 23) case 'H': // �ԋp���t�Ɉ���ɂ����鎞��ݒ肵�܂� retCal.set(Calendar.HOUR_OF_DAY, value); break; // ����ɂ����鎞 (0 - 11) case 'K': // �ԋp���t�Ɉ���ɂ����鎞��ݒ肵�܂� retCal.set(Calendar.HOUR, value); break; // �� case 'm': // �ԋp���t�ɕ���ݒ肵�܂� retCal.set(Calendar.MINUTE, value); break; // �b case 's': // �ԋp���t�ɕb��ݒ肵�܂� retCal.set(Calendar.SECOND, value); break; // �~���b case 'S': // �ԋp���t�Ƀ~���b��ݒ肵�܂� retCal.set(Calendar.MILLISECOND, value); break; // �G���[ default: throw new IllegalArgumentException(); } // �t�H�[�}�b�g�����񌟍��ʒu�Ɠ��̓e�L�X�g�����ʒu���ړ����܂� indexFormat += tokenCount; indexText += tokenCount; } // ���t��Ԃ� return retCal.getTime(); } /** * �w�蕶��������Ƀp�f�B���O�lj��������s���܂��B * * @param str ���ƂȂ镶���� * @param digitCount �\�����܂����� * @return �p�f�B���O�lj����������� */ private static String appendPadding( final String str, final int digitCount) { return appendPadding(str, digitCount, (char) 0); } /** * �w�蕶��������Ƀp�f�B���O�lj��������s���܂��B * * @param str ���ƂȂ镶���� * @param digitCount �\�����܂����� * @param paddingSign �t�����܂��������� * @return �p�f�B���O�lj����������� */ private static String appendPadding( final String str, final int digitCount, final char paddingSign) { final StringBuffer strBuf = new StringBuffer(str); // ������o�b�t�@ int diffCount = digitCount - str.length(); // �������Z�o // ���������̒l�̏ꍇ if (diffCount > 0) { // �������������[�v���܂� for (; diffCount > 0; diffCount--) { // �擪�� 0 ��lj����܂� strBuf.insert(0, '0'); } } else { // �����Ȃ� } // ������t�����܂��ꍇ // ���’lj��敶����o�b�t�@�̐擪���lj����悤�Ƃ��Ă��镄���ȊO�̏ꍇ if ((paddingSign != 0) && (strBuf.length() > 0) && (strBuf.charAt(0) != paddingSign)) { // ������擪�֑}�����܂� strBuf.insert(0, paddingSign); } // �ҏW�����������Ԃ� return strBuf.toString(); } /** * �J�����_�[���N���A���܂��B * * @param cal �N���A���܂��J�����_�[ */ private static void clearCalendar( final Calendar cal) { // ������ null �̏ꍇ�͗�O if (cal == null) { throw new IllegalArgumentException(); } // �N���A�l��ݒ肵�܂� final int clearYear = 1970; // �N final int clearMonth = 0; // �� final int clearDate = 1; // �� final int clearHour = 0; // �� final int clearMinute = 0; // �� final int clearSecond = 0; // �b final int clearMillisecond = 0; // �~���b // �J�����_�[�̓��t���N���A���܂� cal.set(Calendar.YEAR, clearYear); cal.set(Calendar.MONTH, clearMonth); cal.set(Calendar.DATE, clearDate); cal.set(Calendar.HOUR_OF_DAY, clearHour); cal.set(Calendar.MINUTE, clearMinute); cal.set(Calendar.SECOND, clearSecond); cal.set(Calendar.MILLISECOND, clearMillisecond); } /** * ���t�t�H�[�}�b�g�g�[�N�����ǂ����𔻒肵�܂��B * * @param nowChar ��r�Ώە��� */ private static boolean isDateFormatToken( final char nowChar) { boolean retValue = false; for (int i = 0; i < FORMAT_DATE_TIMES.length; i++) { if (FORMAT_DATE_TIMES[i] == nowChar) { retValue = true; break; } } return retValue; } /** * ���t��؂�g�[�N�����ǂ����𔻒肵�܂��B * * @param nowChar ��r�Ώە��� */ private static boolean isDateSplitToken( final char nowChar) { boolean retValue = false; for (int i = 0; i < SPLIT_TOKENS.length; i++) { if (SPLIT_TOKENS[i] == nowChar) { retValue = true; break; } } return retValue; } }