Excelの日付からUnixのタイムスタンプ


85

Excelの日付を正しいUnixタイムスタンプに変換する方法を知っている人はいますか?


「Excelの日付」とはどういう意味ですか?のような人間が読める日時文字列としてフォーマットされたテキストを意味します"11/09/2009 3:23:24 PM"か?
マットボール

4
2038年1月19日に、32ビットオーバーフローのためにUnixタイムスタンプが機能しなくなることを忘れないでください。この瞬間の前に、何百万ものアプリケーションがタイムスタンプの新しい規則を採用するか、タイムスタンプを「ビット」より多く購入する64ビットシステムに移行する必要があります。

13
32ビット以上の時間のように。
user606723 2011

回答:


107

これらのどれも私のために働きませんでした...私がタイムスタンプを元に戻したとき、それは4年離れています。

これは完全に機能しました: =(A2-DATE(1970,1,1))*86400

クレジットの宛先:Filip Czaja http://fczaja.blogspot.ca

元の投稿:http//fczaja.blogspot.ca/2011/06/convert-excel-date-into-timestamp.html


6
タイムゾーンを忘れないでください(UTCにいて、サマータイムを監視していない場合を除く)。UNIXエポックはタイムゾーンに依存しませんが、スプレッドシートはそうではありません。 これが例のあるガイドです。
Adam Katz 2015年

GMT + 8:=((A1+28800)/86400)+25569
Ivan Chau 2016年

CDTの現在の時刻(中部夏時間):=(NOW()-DATE(1970,1,1))*86400 + 5*3600
hBrent 2016年

エクセルの現代版あなたは、セミコロンでカンマを交換しない限り、上記の式を訴えます:(1970;1;1)
ホセ・ルイス・ブランコ

1
@tonygilターゲットにしているセルが実際にExcelの日付である場合に機能します。日付を表すことになっているテキストの場合、すべての賭けは無効です。
ケーシー

76

WindowsおよびMacExcel(2011):

Unix Timestamp = (Excel Timestamp - 25569) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 25569

MAC OS X(2007):

Unix Timestamp = (Excel Timestamp - 24107) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 24107

参考のため:

86400 = Seconds in a day
25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
24107 = Days between 1970/01/01 and 1904/01/02 (min date in Mac Excel 2007)

3
Mac上のOffice2011は、これらの数式の「Windows」バージョンで正常に動作するようです。「Mac」バージョンはかなり離れています。
radicand 2013

1
これらの数式でExcelとUNIXのタイムスタンプを逆にしたと思います。Unixタイムスタンプは秒数であるため、数式で示されているExcelタイムスタンプではなく、86400で割る必要があります。@radicandの回答を参照してください。
マイクヒューストン

コメントありがとうございます。これをMacExcel 2011でテストしたところ、Windowsバージョンと同じように見えます。
Jeff Wu

ミリ秒単位でUNIXのタイミングスタンプを日時に変換し、ミリ秒を維持する方法はありますか?
Lorenzo Belli 2017年

スタックオーバーフローの男は言います。ええ、うるう秒はどうですか、教授。
カタファンフェタミン2017

11

Excelの日付がDateとしてフォーマットされたA1セルにあり、Unixタイムスタンプが数値としてフォーマットされたA2セルにあると仮定すると、A2の数式は次のようになります。

=(A1 * 86400)-2209075200

どこ:

86400は1日の秒数です。2209075200は、ExcelおよびUnixタイムスタンプの基準日である1900-01-01から1970-01-01までの秒数です。

上記はWindowsにも当てはまります。Macの場合、Excelの基準日は1904-01-01であり、秒数は2082844800に修正する必要があります。


少なくともWindowsでは正確には機能しません。19時間遅れています。
LLBBL 2011

4
したがって、次のようになります。=(A1 * 86400)-2209143600
LLBBL

2
Mac Excelのデフォルトの日付ベースは1904ですが、Windows Excelでは1900ですが、設定/計算で[1904年の日付システムを使用する]をオフにすることでMac Excelの日付ベースを変更でき、WindowsExcelのように機能します。
クラウドレンジャー2013

7

Microsoft ExcelなどのスプレッドシートシステムのUTCを想定した、参照用のマッピングを次に示します。

                         Unix  Excel Mac    Excel    Human Date  Human Time
Excel Epoch       -2209075200      -1462        0    1900/01/00* 00:00:00 (local)
Excel ≤ 2011 Mac† -2082758400          0     1462    1904/12/31  00:00:00 (local)
Unix Epoch                  0      24107    25569    1970/01/01  00:00:00 UTC
Example Below      1234567890      38395.6  39857.6  2009/02/13  23:31:30 UTC
Signed Int Max     2147483648      51886    50424    2038/01/19  03:14:08 UTC

One Second                  1       0.0000115740…             —  00:00:01
One Hour                 3600       0.0416666666…             ―  01:00:00
One Day                 86400          1        1             ―  24:00:00

*   「JanZero、1900」は1899/12/31です。以下のバグセクションを参照してください。 Mac(およびそれ以前)用のExcel 2011は、1904日付システムを使用します

 

CSVやスペースで区切られたコンテンツawkを処理するためによく使用するので、UNIXエポックをタイムゾーン/ DSTに適したExcelの日付形式に変換する方法を開発しました。

echoこの例では使用しましたが、最初の列(.csv形式の最初のセルの場合はそれをとして呼び出しますawk -F,)がUNIXエポックであるファイルをパイプ処理できます。アルターは、$1あなたの目的の列/セルの数を表すか、代わりに変数を使用します。

これにより、へのシステムコールが行われdateます。確実にGNUバージョンを入手できる場合は、2>/dev/null || date … +%%zと2番目を削除できます, $1。GNUがどれほど一般的であるかを考えると、BSDのバージョンを想定することはお勧めしません。

getlineが出力するタイムゾーンオフセット読み出しdate +%ztzその後に変換され、hours。形式は-0700PDT)または+0530IST)のようになるため、抽出される最初の部分文字列は07or 05、2番目は00or 30(次に60で割って時間で表す)、3番目の使用はtzオフセットが負であるかどうかを確認して変更しますhours必要に応じて。

このページの他のすべての回答に示されている式を使用して設定しexcel、夏時間対応のタイムゾーン調整をとして追加しhours/24ます。

古いバージョンのExcelfor Macを使用24107している場合は、代わりにを使用する必要があります25569(上記のマッピングを参照)。

任意の非エポック時間をGNU日付でExcelに適した時間に変換するには:

これは基本的に同じコードですが、UNIXエポックを表すdate -dためのがなくなりました@(文字列パーサーの機能を考えると、これ@が必須であることに実際に驚いています。他に9〜10桁の日付形式はありますか?)。以下のために2つの出力:エポックとタイムゾーンオフセット。したがって、たとえば@1234567890入力として使用できます。

バグ

Lotus 1-2-3(元のスプレッドシートソフトウェア)は、1900年をうるう年として意図的に扱いましたが、そうではありませんでした(これにより、すべてのバイトがカウントされるときにコードベースが減少しました)。Microsoft Excel互換性のためにこのバグを保持し、60日目(架空の1900/02/29)をスキップし、Lotus1-2-3の59日目から1900/02/28へのマッピングを保持しました。LibreOfficeは、代わりに60日目を1900/02/28に割り当て、前のすべての日を1日戻しました。

1900/03/01より前の日付は、休日と同じくらいになる可能性があります。

Excelは負の日付を認識せず、ゼロ日について1月のゼロ(1899/12/31)の特別な定義があります。内部的には、Excelは確かに負の日付を処理します(結局のところ、それらは単なる数字です)が、日付として表示する方法がわからないため(また、古い日付を負の数に変換することもできません)、数字として表示します。1900年2月29日、決して起こらなかった日は、Excelによって認識されますが、LibreOfficeによっては認識されません。


4

上記の編集が拒否されたため(実際に試した人はいますか?)、これを機能させるために本当に必要なものは次のとおりです。

Windows(およびMac Office 2011+):

  • Unixタイムスタンプ= (Excel Timestamp - 25569) * 86400
  • Excelのタイムスタンプ= (Unix Timestamp / 86400) + 25569

MAC OS X(Office 2011より前):

  • Unixタイムスタンプ= (Excel Timestamp - 24107) * 86400
  • Excelのタイムスタンプ= (Unix Timestamp / 86400) + 24107

2

明らかに1日、正確に86400秒ずれています。番号2209075200ではなく番号2209161600を使用してください。2つの番号をGoogleで検索すると、上記のサポートが見つかります。私はあなたの公式を試しましたが、いつも私のサーバーとは違う1日でやって来ました。人間の時間ではなくUNIXで考えない限り、UNIXタイムスタンプからは明らかではありません;-)しかし、再確認すると、これが正しい可能性があることがわかります。


Excelは最初の年をうるう年として計算しますが、そうではないため、これは正しいです。
アニサス2011

マジックナンバーが確かに2209161600であることを確認できます。これは、1970-01-01-1900-01-01 + 1日* 86400です。1900-01-01をExcelで入力し、sylk形式で保存して、次のファイルを確認します。テキストエディタでは、その日付が
本来

1

2010.03.2820:12:30のような「人間が読める」日付の古いExcelデータベース がありました。これらの日付はUTC + 1(CET)であり、エポック時間に変換する必要がありました。

私が使用=(1; A4-DATE(1970 1))* 86400から3600の式をB列の値にAカラムからエポック時間に日付を変換します。タイムゾーンオフセットを確認し、それを使って計算します。1時間は3600秒です。

私がここに答えを書く唯一の理由は、このトピックが5年以上前のものであることがわかります。これは、このトピックで新しいExcelバージョンと赤い投稿を使用していることですが、それらは正しくありません。日付(1970; 1; 1)。ここでは、1970年と1月を;で区切る必要があります。ではなく、

この問題も発生している場合は、それがお役に立てば幸いです。ごきげんよう :)


0

私のデータはUNIX側からこの形式であったため、現在の回答はどれもうまくいきませんでした。

2016-02-02 19:21:42 UTC

エポックタイムスタンプを持つ他のデータを参照できるように、これをエポックに変換する必要がありました。

  1. 日付部分の新しい列を作成し、この式で解析します

    =DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4)) 
    
  2. 他のGrendlerがすでにここで述べているように、別の列を作成します

    =(B2-DATE(1970,1,1))*86400 
    
  3. 合計秒数を取得するには、時間を合計した別の列を作成します。

    =(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
    
  4. 最後の2つの列を足し合わせるだけの最後の列を作成します。

    =C2+D2
    

0

これが私の究極の答えです。

また、JavaScriptのnew Date(year, month, day)コンストラクターはうるう秒も考慮していないようです。

// Parses an Excel Date ("serial") into a
// corresponding javascript Date in UTC+0 timezone.
//
// Doesn't account for leap seconds.
// Therefore is not 100% correct.
// But will do, I guess, since we're
// not doing rocket science here.
//
// https://www.pcworld.com/article/3063622/software/mastering-excel-date-time-serial-numbers-networkdays-datevalue-and-more.html
// "If you need to calculate dates in your spreadsheets,
//  Excel uses its own unique system, which it calls Serial Numbers".
//
lib.parseExcelDate = function (excelSerialDate) {
  // "Excel serial date" is just
  // the count of days since `01/01/1900`
  // (seems that it may be even fractional).
  //
  // The count of days elapsed
  // since `01/01/1900` (Excel epoch)
  // till `01/01/1970` (Unix epoch).
  // Accounts for leap years
  // (19 of them, yielding 19 extra days).
  const daysBeforeUnixEpoch = 70 * 365 + 19;

  // An hour, approximately, because a minute
  // may be longer than 60 seconds, see "leap seconds".
  const hour = 60 * 60 * 1000;

  // "In the 1900 system, the serial number 1 represents January 1, 1900, 12:00:00 a.m.
  //  while the number 0 represents the fictitious date January 0, 1900".
  // These extra 12 hours are a hack to make things
  // a little bit less weird when rendering parsed dates.
  // E.g. if a date `Jan 1st, 2017` gets parsed as
  // `Jan 1st, 2017, 00:00 UTC` then when displayed in the US
  // it would show up as `Dec 31st, 2016, 19:00 UTC-05` (Austin, Texas).
  // That would be weird for a website user.
  // Therefore this extra 12-hour padding is added
  // to compensate for the most weird cases like this
  // (doesn't solve all of them, but most of them).
  // And if you ask what about -12/+12 border then
  // the answer is people there are already accustomed
  // to the weird time behaviour when their neighbours
  // may have completely different date than they do.
  //
  // `Math.round()` rounds all time fractions
  // smaller than a millisecond (e.g. nanoseconds)
  // but it's unlikely that an Excel serial date
  // is gonna contain even seconds.
  //
  return new Date(Math.round((excelSerialDate - daysBeforeUnixEpoch) * 24 * hour) + 12 * hour);
};

0

夏時間(3月の最後の日曜日から10月の最後の日曜日まで)を補うために、次の式を使用する必要がありました。

=IF(
  AND(
    A2>=EOMONTH(DATE(YEAR(A2);3;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);3;1);0);11);7);
    A2<=EOMONTH(DATE(YEAR(A2);10;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);10;1);0);11);7)
  );
  (A2-DATE(1970;1;1)-TIME(1;0;0))*24*60*60*1000;
  (A2-DATE(1970;1;1))*24*60*60*1000
)

簡単な説明:

日付["A2"]が3月の最後の日曜日と10月の最後の日曜日[3番目と4番目のコード行]の間にある場合、日付から1時間[-TIME(1; 0; 0)]を減算します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.