talendでExcelのシリアル値の日付を日付文字列に変換する自作関数
シリアル値…それは1900/01/12からの日数!
talendを使ってExcelからデータを取り込む際に、日付をシリアル値で持っているセルをそのまま取り込むとシリアル値の数字で取り込まれてしまうため、日付の文字列に変換する関数を作った。
※シリアル値から日付型に直変換できないと思ってこんな関数作ってますが、「そんなの必要ない」とかあればご教示ください…。
見出しの通り、シリアル値は1900年1月12日から指定した日付までの日数を示す値なので計算すればシリアル値から日付を求めることができる。
シリアル値の計算で注意すること
1900年1月12日=シリアル値「1」からの日数の合計ではあるが、1つ罠がある。
1900年2月29日は実在しないのに、Excelおよびスプレッドシート系の関数内では存在していることになっているらしい。
詳しくはこちらが解説してくださっているが、歴史的経緯と互換性の問題でずっと残っているようだ。
そのため、1900年2月29日=シリアル値で言うと60日以降であれば1日マイナスする必要がある。
ということでJavaのコード
筆者そんなにJava書かない人なので動けばいいや!の精神で書いているコードである。
バッチリな方はしっかりエラー処理や無駄なロジックは省いていただきたい。
また、日付型文字列になればとりあえず良かったのでString型で返すようになっている。
public static String SerialDateToY4M2D2(String input) {
// Excelのシリアル値を日付型文字列化
if (input = null && input.isEmpty() ) {
// 入力がnullか空の場合は空白文字をリターンして終了。
return "";
}
int SerialNumber;
String RetrunDateString;
try {
// 1900年1月12日がシリアル値1のため、加算する値は取得したシリアル値−1にする。
SerialNumber = Integer.parseInt(input) - 1;
// 1900年2月29日は現実には存在していないがシリアル値上は存在(60)するので、
// シリアル値が60以降であればさらに−1する。
SerialNumber -= (SerialNumber > 60 ? 1 :0);
} catch (NumberFormatException e) {
// とりあえず数値変換エラーだったら空白を返す。
return "";
}
Calendar CalDate = Calendar.getInstance();
// シリアル値の開始日である1900年1月12日をセットする。
// 月は0始まり…。
CalDate.set(1900, 0,12,0,0,0);
CalDate.add(Calendar.DATE, SerialNumber);
// シリアル値を加算した日付を日付文字列(YYYY/MM/DD)に変換。
SimpleDateFormat DateForm = new SimpleDateFormat("yyyy/MM/dd");
RetrunDateString = DateForm.format(CalDate.getTime());
// 日付文字列をリターン
return RetrunDateString;
}
コメント
コメントを投稿