365連休

にわかのandroidとかの開発メモ。

Android Studio 3.5 MediaStoreから取得したデータの日付フィールドが西暦2/11/30!!??

ContentResolver#queryでMediaStoreから取得したデータの内、日時フィールドは1970-01-01T00:00:00Zから経過ミリ秒が入っている。

 

これをCalendar#setTimeInMillisをして文字列として日時を得ることができる。

 

しかし、JPEGファイルのExifの日時には0000:00:00 00:00:00(YYYY:MM:DD HH:MM:SS)というASCII値が入っていたりする。

 

一般的な暦には0年も0月も0日も存在しない。

日時が不明な場合にカメラやJPEG編集ソフトが余計な事をして気を利かして設定してくださりやがる。

 

 

これをメディアストレージさんが無理やり頑張って変換すると、

0年だから1年の前ってこと=紀元前1年

0月だから1月の前ってこと=紀元前1年1月の前=紀元前2年12月

0日だから1日の前ってこと=紀元前2年12月1日の前=紀元前2年11月30日 0:00:00

 

さらに、日時は経過ミリ秒でメディアストレージに保存されるので、-62170156800000L(-0002/11/30 0:00:00' 000)という値が登録されることになる。

 

この値をCalendar#setTimeInMillis(-62170156800000L)とすると、書式にAD/BCという表記がないため西暦2年11月30日という謎の日付が出来上がる。

0000/00/00よりちょっと増える不思議。

 

 

正常に保存された紀元前のデータは存在しないと思われるので、null値として扱えばいいと思う。

無視する場合の閾値
datetime < -62170156800000L(-0002/11/30 0:00:00' 000)ではなく
datetime < -62135769600000L(0001/01/01 0:00:00' 000)なので間違えないこと。

 

直接Exifの日付をASCIIで取得することができるなら、0000:00:00 00:00:00という値は日付として正しく無いため、それを持ってnull扱いとするのが良いと思う。

 

 

 

ちなみにExifタグの日付フィールド(GPSDateStamp含む)はYYYY:MM:DDのASCII形式で保存しなければならないので、紀元前の日付を設定することはできない。