Coverage Report - com.orangesignal.jlha.MsdosDate
 
Classes in this File Line Coverage Branch Coverage Complexity
MsdosDate
25%
6/24
16%
2/12
2.125
 
 1  
 /**
 2  
  * Copyright (C) 2001-2002  Michel Ishizuka  All rights reserved.
 3  
  * 
 4  
  * 以下の条件に同意するならばソースとバイナリ形式の再配布と使用を
 5  
  * 変更の有無にかかわらず許可する。
 6  
  * 
 7  
  * 1.ソースコードの再配布において著作権表示と この条件のリスト
 8  
  *     および下記の声明文を保持しなくてはならない。
 9  
  * 
 10  
  * 2.バイナリ形式の再配布において著作権表示と この条件のリスト
 11  
  *     および下記の声明文を使用説明書もしくは その他の配布物内に
 12  
  *     含む資料に記述しなければならない。
 13  
  * 
 14  
  * このソフトウェアは石塚美珠瑠によって無保証で提供され、特定の目
 15  
  * 的を達成できるという保証、商品価値が有るという保証にとどまらず、
 16  
  * いかなる明示的および暗示的な保証もしない。
 17  
  * 石塚美珠瑠は このソフトウェアの使用による直接的、間接的、偶発
 18  
  * 的、特殊な、典型的な、あるいは必然的な損害(使用によるデータの
 19  
  * 損失、業務の中断や見込まれていた利益の遺失、代替製品もしくは
 20  
  * サービスの導入費等が考えられるが、決してそれだけに限定されない
 21  
  * 損害)に対して、いかなる事態の原因となったとしても、契約上の責
 22  
  * 任や無過失責任を含む いかなる責任があろうとも、たとえそれが不
 23  
  * 正行為のためであったとしても、またはそのような損害の可能性が報
 24  
  * 告されていたとしても一切の責任を負わないものとする。
 25  
  */
 26  
 
 27  
 package com.orangesignal.jlha;
 28  
 
 29  
 import java.util.Date;
 30  
 
 31  
 /**
 32  
  * MS-DOS形式の時間情報を扱うDateの派生クラス。<br>
 33  
  * データは 4byte値であり、MS-DOSが 主にIntel の x86系CPU上で 動作したことから LittleEndianで格納される。<br>
 34  
  * フォーマットは以下のとおり。<br>
 35  
  * 
 36  
  * <pre>
 37  
  * +---------------+---------------++---------------+---------------+
 38  
  * | 日付-上位byte | 日付-下位byte || 時刻-上位byte | 時刻-下位byte |
 39  
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 40  
  * |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0||7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|
 41  
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 42  
  * |   年-7bit   |月-4bit| 日-5bit ||時間-5bit|  分-6bit  | 秒-5bit |
 43  
  * +-------------+-------+---------++---------+-----------+---------+
 44  
  * </pre>
 45  
  * 
 46  
  * ・年は 1980~2107年 を 0~127 で表す。WindowsのシステムAPIの 一部は 2099年までしかサポートしないという情報がある。<br>
 47  
  * ・月は 1~12月 を 1~12で表す。0~11でないことに注意。<br>
 48  
  * ・日は 1~31日 を 1~31で表す。0~30でないことに注意。<br>
 49  
  * ・時間は 0~23時 を 0~23で表す。<br>
 50  
  * ・分は 0~59分 を 0~59で表す。<br>
 51  
  * ・秒は 0~58秒 を 0~29で表す。秒の情報はビット数が足りない ため 最小単位は 1秒でなく 2秒である。<br>
 52  
  * 
 53  
  * <pre>
 54  
  * -- revision history --
 55  
  * $Log: MsdosDate.java,v $
 56  
  * Revision 1.1  2002/12/05 00:00:00  dangan
 57  
  * [maintenance]
 58  
  *     javadoc コメントのスペルミスを修正。
 59  
  *     ソース整備
 60  
  * 
 61  
  * Revision 1.0  2002/07/24 00:00:00  dangan
 62  
  * add to version control
 63  
  * [bug fix]
 64  
  *     setTime() で ftimeの限界精度である2秒以上の精度で記録していた。
 65  
  * [maintenance]
 66  
  *     タブの廃止
 67  
  *     ライセンス文の修正
 68  
  * 
 69  
  * </pre>
 70  
  * 
 71  
  * @author $Author: dangan $
 72  
  * @version $Revision: 1.1 $
 73  
  */
 74  
 @SuppressWarnings("serial")
 75  
 class MsdosDate extends Date implements Cloneable {
 76  
 
 77  
         // ------------------------------------------------------------------
 78  
         // Constructor
 79  
 
 80  
         /**
 81  
          * date で示される時間を表す MsdosDate を構築する。 <br>
 82  
          * MS-DOS 形式の時間情報で表せない細かい精度の情報は 無視され、最小時間単位は java.util.Date の 1ミリ秒でなく MS-DOS 形式の時間情報 の最小単位である 2秒となる。
 83  
          * 
 84  
          * @param date 新しく構築される MsdosDate の基になる時間情報 を持つ Dateオブジェクト
 85  
          * @exception IllegalArgumentException date が MS-DOS時間形式で扱えない範囲の時間を 示していた場合
 86  
          */
 87  
         public MsdosDate(final Date date) {
 88  0
                 super(date.getTime() / 2000L * 2000L);
 89  0
                 checkRange();
 90  0
         }
 91  
 
 92  
         /**
 93  
          * MS-DOS 形式の時間情報から 新しい MsdosDate を構築 する。
 94  
          * 
 95  
          * @param time MS-DOS 形式の時間情報
 96  
          */
 97  
         @SuppressWarnings("deprecation")
 98  
         public MsdosDate(final int time) {
 99  8
                 super((time >> 25 & 0x7F) + 80, (time >> 21 & 0x0F) - 1,
 100  
                                 time >> 16 & 0x1F, time >> 11 & 0x1F, time >> 5 & 0x3F,
 101  
                                 time << 1 & 0x3F);                                         // deprecated
 102  
 
 103  8
                 checkRange();
 104  8
         }
 105  
 
 106  
         /**
 107  
          * このオブジェクトのコピーを返す。
 108  
          * 
 109  
          * @return このMsdosDateオブジェクトの複製
 110  
          */
 111  
         @Override
 112  
         public Object clone() {
 113  0
                 return new MsdosDate(this);
 114  
         }
 115  
 
 116  
         /**
 117  
          * この MsdosDate の示す年を year で指定された値に1900を足し たものに設定する。<br>
 118  
          * このメソッドは範囲チェックを行うだけのために存在する。<br>
 119  
          * 
 120  
          * @param year 1900を足すことで西暦を表すような 年の値
 121  
          * @exception IllegalArgumentException year が MS-DOS時間形式で扱えない範囲の時間を 示していた場合
 122  
          * @deprecated
 123  
          */
 124  
         @SuppressWarnings("deprecation")
 125  
         @Deprecated
 126  
         @Override
 127  
         public void setYear(final int year) {
 128  0
                 if (year < 80 || 207 < year) {
 129  0
                         throw new IllegalArgumentException("out of MS-DOS time format range.");
 130  
                 }
 131  0
                 super.setYear(year);                                              // deprecated
 132  0
         }
 133  
 
 134  
         /**
 135  
          * この MsdosDate の示す時間を 1970年1月1日 00:00:00 GMTから time ミリ秒経過した時刻に設定する。<br>
 136  
          * MS-DOS 形式の時間情報で表せない細かい精度の情報は 無視され、最小時間単位は java.util.Date の 1ミリ秒でなく MS-DOS 形式の時間情報 の最小単位である 2秒となる。
 137  
          * 
 138  
          * @param time 1970年1月1日 00:00:00GMT からの経過ミリ秒
 139  
          * @exception IllegalArgumentException time が MS-DOS時間形式で扱えない範囲の時間を 示していた場合
 140  
          */
 141  
         @Override
 142  
         public void setTime(final long time) {
 143  
                 @SuppressWarnings("deprecation")
 144  0
                 final int year = new Date(time).getYear();
 145  0
                 if (year < 80 || 207 < year) {
 146  0
                         throw new IllegalArgumentException("out of MS-DOS time format range.");
 147  
                 }
 148  0
                 super.setTime(time / 2000L * 2000L);
 149  0
         }
 150  
 
 151  
         /**
 152  
          * この MsdosDate に MS-DOS 時間形式の時間情報を設定する。
 153  
          * 
 154  
          * @param time MS-DOS 時間形式の時間情報
 155  
          */
 156  
         public void setMsdosTime(final int time) {
 157  
                 @SuppressWarnings("deprecation")
 158  0
                 final Date date = new Date((time >> 25 & 0x7F) + 80,
 159  
                                 (time >> 21 & 0x0F) - 1, time >> 16 & 0x1F, time >> 11 & 0x1F,
 160  
                                 time >> 5 & 0x3F, time << 1 & 0x3F);                          // deprecated
 161  
 
 162  0
                 setTime(date.getTime());
 163  0
         }
 164  
 
 165  
         /**
 166  
          * この MsdosDateが示す時間情報を MS-DOS 時間形式で得る。
 167  
          * 
 168  
          * @return MS-DOS時間形式の値
 169  
          */
 170  
         @SuppressWarnings("deprecation")
 171  
         public int getMsdosTime() {
 172  0
                 return super.getYear() - 80 << 25                               // deprecated
 173  
                                 | super.getMonth() + 1 << 21                             // deprecated
 174  
                                 | super.getDate() << 16                                   // deprecated
 175  
                                 | super.getHours() << 11                                   // deprecated
 176  
                                 | super.getMinutes() << 5                                   // deprecated
 177  
                                 | super.getSeconds() >> 1;                                  // deprecated
 178  
         }
 179  
 
 180  
         /**
 181  
          * この MsdosDate が MS-DOS時間形式で表せる時間の範囲内で あるかを判定する。
 182  
          * 
 183  
          * @exception IllegalArgumentException この MsdosDate が MS-DOS時間形式で扱えない 範囲の時間を示していた場合
 184  
          */
 185  
         private void checkRange() {
 186  
                 @SuppressWarnings("deprecation")
 187  8
                 final int year = getYear();
 188  8
                 if (year < 80 || 207 < year) {
 189  0
                         throw new IllegalArgumentException("out of MS-DOS time format range.");
 190  
                 }
 191  8
         }
 192  
 
 193  
 }