シリアル値から UNIX Time (time_t) への変換

Excel では,日付・時間の値を1900年1月1日からの通算日であるシリアル値と呼ばれる値で保持しているようです.また,シリアル値は小数であることもあり,その場合の小数点以下の値は,時,分,秒を日単位に直した時の値を表すようです.

シリアル値の小数部分は「時刻」を表します。

0時0分0秒を「0.0」、翌日の0時0分0秒を「1.0」とし、「日」を単位とした時間を表します。

例えば「12時」であれば、12時間/24時間=0.5、「15時30分」は(15*60+30)分/(24*60)分=0.64.....、「12時00分1秒」は(12*60*60+1)秒/(24*60*60)秒=0.500012

つまり、「時分秒」を「日」という単位に置き換えているだけなのです。

http://www.excel-jiten.net/formula/serial_datetime.html

シリアル値のままでは扱いづらいので,いったん UNIX Time (time_t) に変換することを考えます.シリアル値 -> time_t へ変換する関数は以下のようになります(参考:グレゴリオ暦/ユリウス暦 ⇔ ユリウス日 (または一般の通算日数) 変換アルゴリズム).

std::time_t serial_to_time_utc(double src) {
    std::time_t dest = static_cast<std::time_t>((src - 25569.0) * 86400.0);
    return dest;
}

std::time_t serial_to_time_jst(double src) {
    std::time_t dest = static_cast<std::time_t>((src - 25569.0) * 86400.0) - 32400;
    return dest;
}
  • 1日の秒数:24時間×60分×60秒 = 86400秒
  • UTC に対する JST の時差:+9時間 = +32400秒
  • UNIX Time の基準時刻 (1970/01/01(木) 00:00:00 UTC) に相当するシリアル値:25569
グレゴリオ暦/ユリウス暦 ⇔ ユリウス日 (または一般の通算日数) 変換アルゴリズム

Excel でデフォルトで用意されている日付・時刻に関する書式一覧

また,Standard ECMA-376 によると,Excel は日付・時間に対して,以下の書式を用意しているようです.

general(各国共通)
ID 書式
14 mm-dd-yy (※Excel JP では yyyy/m/d と出力される
15 d-mmm-yy
16 d-mmm
17 mmm-yy
18 h:mm AM/PM
19 h:mm:ss AM/PM
20 h:mm
21 h:mm:ss
22 m/d/yy h:mm (※Excel JP では yyyy/m/d h:mm と出力される
45 mm:ss
46 [h]:mm:ss
47 mmss.0
ja-jp(日本専用)
ID 書式
27 [$-411]ge.m.d
28 [$-411]ggge"年"m"月"d"日"
29 [$-411]ggge"年"m"月"d"日"
30 m/d/yy
31 yyyy"年"m"月"d"日"
32 h"時"mm"分"
33 h"時"mm"分"ss"秒"
34 yyyy"年"m"月"
35 m"月"d"日"
36 [$-411]ge.m.d
50 [$-411]ge.m.d
51 [$-411]ggge"年"m"月"d"日"
52 yyyy"年"m"月"
53 m"月"d"日"
54 [$-411]ggge"年"m"月"d"日"
55 yyyy"年"m"月"
56 m"月"d"日"
57 [$-411]ge.m.d
58 [$-411]ggge"年"m"月"d"日"

尚,書式中の各記号の意味は下記の通りです.

  • g ..... 元号(明治,大正,昭和,平成)
  • gg ..... 元号の省略形(明,大,昭,平)
  • ggg ..... 元号のイニシャル(M, T, S, H)
  • e ..... 和暦の年(1, 2, ... のようにゼロを含まない?)
  • ee ..... 和暦の年(01, 02, ... のようにゼロを含む?)
  • yy ..... 西暦の下2桁
  • yyyy ..... 西暦の4桁全て
  • m ..... 月(1, 2, ... のようにゼロを含まない)
  • mm ..... 月(01, 02, ... のようにゼロを含む)
  • mmm ..... 月名の省略形(Jan, Feb, ...)
  • mmmm ..... 月名(January, February, ...)
  • mmmmm ..... 月名の最初の 1 文字(J, F, ...)
  • d ..... 日(1, 2, ... のようにゼロを含まない)
  • dd ..... 日(01, 02, ... のようにゼロを含む)
  • ddd ..... 曜日の省略形(Sun, Mon, ...)
  • dddd ..... 曜日(Sunday, Monday, ...)
  • h ..... 時(0, 1, 2, ... のようにゼロを含まない)
  • hh ..... 時(00, 01, 02, ... のようにゼロを含む)
  • m ..... 分(0, 1, 2, ... のようにゼロを含まない.月と同じ記号が使用されているので注意)
  • mm ..... 分(00, 01, 02, ... のようにゼロを含む.月と同じ記号が使用されているので注意)
  • s ..... 秒(0, 1, 2, ... のようにゼロを含まない)
  • ss ..... 秒(00, 01, 02, ... のようにゼロを含む)