Googleブックマークによって生成されたエクスポートファイルからブックマークを解析する作業を行っています。このファイルには、次の日付属性が含まれています。
ADD_DATE="1231721701079000"
ADD_DATE="1227217588219000"
これらは、標準的な UNIX スタイルのタイムスタンプではありません。誰かがここで私を正しい方向に向けることができますか? あなたが本当に私を助けたいと感じているなら、私はc#を使ってそれらを解析します.
Googleブックマークによって生成されたエクスポートファイルからブックマークを解析する作業を行っています。このファイルには、次の日付属性が含まれています。
ADD_DATE="1231721701079000"
ADD_DATE="1227217588219000"
これらは、標準的な UNIX スタイルのタイムスタンプではありません。誰かがここで私を正しい方向に向けることができますか? あなたが本当に私を助けたいと感じているなら、私はc#を使ってそれらを解析します.
Chrome では、修正された Windows タイム形式 (“<a href="http://blogs.msdn.com/b/oldnewthing/archive/2009/03/06/9461176.aspx" rel="noreferrer">WindowsBookmarks
ファイルと履歴ファイルの両方で、そのタイムスタンプのエポック」) 。Windows Time 形式は、1601 年 1 月 1 日からの 100ns-es の数値です。Chrome 形式は、同じ日付からのマイクロ秒数であるため、1/10 になります。
Chrome タイムスタンプを Unix エポックとの間で変換するには、秒に変換し、2 つの基本日時 (11644473600) の差を補正する必要があります。
Unix、JavaScript (Unix はミリ秒単位)、Windows、および Chrome のタイムスタンプの変換式は次のとおりです (+/× と -/÷ を並べ替えることができますが、精度が少し失われます)。
u : Unix timestamp eg: 1378615325
j : JavaScript timestamp eg: 1378615325177
c : Chrome timestamp eg: 13902597987770000
w : Windows timestamp eg: 139025979877700000
u = (j / 1000)
u = (c - 116444736000000) / 10000000
u = (w - 1164447360000000) / 100000000
j = (u * 1000)
j = (c - 116444736000000) / 10000
j = (w - 1164447360000000) / 100000
c = (u * 10000000) + 116444736000000
c = (j * 10000) + 116444736000000
c = (w / 10)
w = (u * 100000000) + 1164447360000000
w = (j * 100000) + 1164447360000000
w = (c * 10)
これらは非常に大きな数値であるため、64 ビットの数値を使用するか、PHP の BC-math モジュールのように文字列として処理する必要があることに注意してください。
Javascript では、コードは次のようになります
function chromeDtToDate(st_dt) {
var microseconds = parseInt(st_dt, 10);
var millis = microseconds / 1000;
var past = new Date(1601, 0, 1).getTime();
return new Date(past + millis);
}
1231721701079000 は、1970 年 1 月 1 日からの時間 (マイクロ秒単位) に疑わしく見えます。
perl -wle 'print scalar gmtime(1231721701079000/1_000_000)'
Mon Jan 12 00:55:01 2009
既知の時間にいくつかのブックマークを作成し、確認するために試してみました。
最初に見たところ、下の 6 桁を切り落とすと、オンライン コンバーターを使用して妥当な Unix Date が得られるように見えます。
1231721701 = 2009 年 1 月 12 日月曜日 00:55:01 GMT
1227217588 = 2008 年 11 月 20 日木曜日 21:46:28 GMT
余分な 6 桁は、フォーマット関連またはある種の拡張属性である可能性があります。
Unix タイムスタンプの変換が実際にそうである場合、サンプル コードがいくつかあります。
コード サンプルについては、こちらを参照してください: http://www.epochconverter.com/#code
// my groovy (java) code finally came out as:
def convertDate(def epoch)
{
long dv = epoch / 1000; // divide by 1,000 to avoid milliseconds
String dt = new java.text.SimpleDateFormat("dd/MMM/yyyy HH:mm:ss").format(new java.util.Date (dv));
// to get epoch date:
//long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() * 1000;
return dt;
} // end of def
したがって、jsonとしてエクスポートされたFirefoxのブックマークの日付は私に与えました:
json.lastModified :1366313580447014
convert from epoch date:18/Apr/2013 21:33:00
から :
println "convert from epoch date:"+convertDate(json.lastModified)
function ConvertToDateTime(srcChromeBookmarkDate) {
//Hp --> The base date which google chrome considers while adding bookmarks
var baseDate = new Date(1601, 0, 1);
//Hp --> Total number of seconds in a day.
var totalSecondsPerDay = 86400;
//Hp --> Read total number of days and seconds from source chrome bookmark date.
var quotient = Math.floor(srcChromeBookmarkDate / 1000000);
var totalNoOfDays = Math.floor(quotient / totalSecondsPerDay);
var totalNoOfSeconds = quotient % totalSecondsPerDay;
//Hp --> Add total number of days to base google chrome date.
var targetDate = new Date(baseDate.setDate(baseDate.getDate() + totalNoOfDays));
//Hp --> Add total number of seconds to target date.
return new Date(targetDate.setSeconds(targetDate.getSeconds() + totalNoOfSeconds));
}
var myDate = ConvertToDateTime(13236951113528894);
var alert(myDate);
//Thu Jun 18 2020 10:51:53 GMT+0100 (Irish Standard Time)