(おまけ) F#でExcelの日付データのシリアル値をDateTime型に変換する。

Excelのバグで1900/2/29の日付が存在します。
そのため、それ以降の日付のシリアル値に誤差が生じるたりします。
それも踏まえた形で関数を作成。

この関数はExcel-DNAくらいでしか使わないと思われます。


■実行結果

> getDate 36526;;
val it : DateTime = 2000/01/01 0:00:00 {Date = 2000/01/01 0:00:00;
                                        Day = 1;
                                        DayOfWeek = Saturday;
                                        DayOfYear = 1;
                                        Hour = 0;
                                        Kind = Unspecified;
                                        Millisecond = 0;
                                        Minute = 0;
                                        Month = 1;
                                        Second = 0;
                                        Ticks = 630822816000000000L;
                                        TimeOfDay = 00:00:00;
                                        Year = 2000;}
> getDate 73051;;
val it : DateTime = 2100/01/01 0:00:00 {Date = 2100/01/01 0:00:00;
                                        Day = 1;
                                        DayOfWeek = Friday;
                                        DayOfYear = 1;
                                        Hour = 0;
                                        Kind = Unspecified;
                                        Millisecond = 0;
                                        Minute = 0;
                                        Month = 1;
                                        Second = 0;
                                        Ticks = 662380416000000000L;
                                        TimeOfDay = 00:00:00;
                                        Year = 2100;}

ソースコード

open System

/// Excel日付の規定値
let excelBaseDate = DateTime.Parse("1899/12/31")
/// Excel日付シリアル値をDateTimeに変換する。
let getDate x =
    let x = if x < 59 then x else x - 1
    excelBaseDate.AddDays(float x)
/// Excel日付シリアル値をDateTimeに変換する。
let getTryDate x =
    try
        Some <| getDate x
    with
    | _ -> None
    • -