Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
MsdosDate |
|
| 2.125;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 | } |