Excelの日付を正しいUnixタイムスタンプに変換する方法を知っている人はいますか?
Excelの日付を正しいUnixタイムスタンプに変換する方法を知っている人はいますか?
回答:
これらのどれも私のために働きませんでした...私がタイムスタンプを元に戻したとき、それは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
=((A1+28800)/86400)+25569
=(NOW()-DATE(1970,1,1))*86400 + 5*3600
(1970;1;1)
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)
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に修正する必要があります。
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 1234567890 |awk '{
# tries GNU date, tries BSD date on failure
cmd = sprintf("date -d@%d +%%z 2>/dev/null || date -jf %%s %d +%%z", $1, $1)
cmd |getline tz # read in time-specific offset
hours = substr(tz, 2, 2) + substr(tz, 4) / 60 # hours + minutes (hi, India)
if (tz ~ /^-/) hours *= -1 # offset direction (east/west)
excel = $1/86400 + hours/24 + 25569 # as days, plus offset
printf "%.9f\n", excel
}'
echo
この例では使用しましたが、最初の列(.csv形式の最初のセルの場合はそれをとして呼び出しますawk -F,
)がUNIXエポックであるファイルをパイプ処理できます。アルターは、$1
あなたの目的の列/セルの数を表すか、代わりに変数を使用します。
これにより、へのシステムコールが行われdate
ます。確実にGNUバージョンを入手できる場合は、2>/dev/null || date … +%%z
と2番目を削除できます, $1
。GNUがどれほど一般的であるかを考えると、BSDのバージョンを想定することはお勧めしません。
getline
が出力するタイムゾーンオフセット読み出しdate +%z
にtz
その後に変換され、hours
。形式は-0700
(PDT)または+0530
(IST)のようになるため、抽出される最初の部分文字列は07
or 05
、2番目は00
or 30
(次に60で割って時間で表す)、3番目の使用はtz
オフセットが負であるかどうかを確認して変更しますhours
必要に応じて。
このページの他のすべての回答に示されている式を使用して設定しexcel
、夏時間対応のタイムゾーン調整をとして追加しhours/24
ます。
古いバージョンのExcelfor Macを使用24107
している場合は、代わりにを使用する必要があります25569
(上記のマッピングを参照)。
任意の非エポック時間をGNU日付でExcelに適した時間に変換するには:
echo "last thursday" |awk '{
cmd = sprintf("date -d \"%s\" +\"%%s %%z\"", $0)
cmd |getline
hours = substr($2, 2, 2) + substr($2, 4) / 60
if ($2 ~ /^-/) hours *= -1
excel = $1/86400 + hours/24 + 25569
printf "%.9f\n", 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より前の日付は、休日と同じくらいになる可能性があります。
Day Excel LibreOffice
-1 -1 1899/12/29
0 1900/01/00* 1899/12/30
1 1900/01/01 1899/12/31
2 1900/01/02 1900/01/01
…
59 1900/02/28 1900/02/27
60 1900/02/29(!) 1900/02/28
61 1900/03/01 1900/03/01
Excelは負の日付を認識せず、ゼロ日について1月のゼロ(1899/12/31)の特別な定義があります。内部的には、Excelは確かに負の日付を処理します(結局のところ、それらは単なる数字です)が、日付として表示する方法がわからないため(また、古い日付を負の数に変換することもできません)、数字として表示します。1900年2月29日、決して起こらなかった日は、Excelによって認識されますが、LibreOfficeによっては認識されません。
上記の編集が拒否されたため(実際に試した人はいますか?)、これを機能させるために本当に必要なものは次のとおりです。
Windows(およびMac Office 2011+):
(Excel Timestamp - 25569) * 86400
(Unix Timestamp / 86400) + 25569
MAC OS X(Office 2011より前):
(Excel Timestamp - 24107) * 86400
(Unix Timestamp / 86400) + 24107
明らかに1日、正確に86400秒ずれています。番号2209075200ではなく番号2209161600を使用してください。2つの番号をGoogleで検索すると、上記のサポートが見つかります。私はあなたの公式を試しましたが、いつも私のサーバーとは違う1日でやって来ました。人間の時間ではなくUNIXで考えない限り、UNIXタイムスタンプからは明らかではありません;-)しかし、再確認すると、これが正しい可能性があることがわかります。
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月を;で区切る必要があります。ではなく、
この問題も発生している場合は、それがお役に立てば幸いです。ごきげんよう :)
私のデータはUNIX側からこの形式であったため、現在の回答はどれもうまくいきませんでした。
2016-02-02 19:21:42 UTC
エポックタイムスタンプを持つ他のデータを参照できるように、これをエポックに変換する必要がありました。
日付部分の新しい列を作成し、この式で解析します
=DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4))
他のGrendlerがすでにここで述べているように、別の列を作成します
=(B2-DATE(1970,1,1))*86400
合計秒数を取得するには、時間を合計した別の列を作成します。
=(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
最後の2つの列を足し合わせるだけの最後の列を作成します。
=C2+D2
これが私の究極の答えです。
また、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);
};
夏時間(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)]を減算します。
"11/09/2009 3:23:24 PM"
か?