この 635151121709530000 の時刻形式と変換方法を教えてください。結果は 2013-9-18 14:42:50 のようになります
ありがとう
数値を時間に変換するのに十分な情報がありません。 特定の時点を表すには、少なくとも 2 つの一般的な方法があります。
最初の (そして最も一般的な) 数値は、タイムスタンプによって表される時間と何らかの「エポック」日付との間の時間単位のカウントを表すことです。それを日付に変換するには、2 つの情報が必要です: スケール (タイムスタンプ N と N+1 の間の経過時間) と参照タイムスタンプ (通常、エポック日付であり、数値 0 が表す日付/時刻)。
その情報がなければ、少なくとも2 つのタイムスタンプと、それぞれが表す日付/時刻が必要になります。次に、それらの差を見つけ、秒数で割ると、スケールが得られます。その後、推定してエポック日付を見つけることができます。
2 番目の可能性は、数値がビット フィールドであり、日付の各部分が整数の特定のビット セットで表されることです。
もしそうなら、あなたはやや失敗しています。日付部分をビット フィールドに収めるために、あらゆる種類の計算が行われる可能性があります。システムの担当者に尋ねるか、それが現在あなたである場合は、タイムスタンプを生成するコードを調べる必要があります。
編集:コメントで提供された数字を使用すると、次のようになります。
635155956336800000 2013-9-24 05:00:33
635155957368670000 2013-9-24 05:02:16
635155968617830000 2013-9-24 05:21:10
635155968728200000 2013-9-24 05:21:12
635155971811300000 2013-9-24 05:26:21
635155972798800000 2013-9-24 05:27:59
635155978347870000 2013-9-24 05:37:14
数字がカウントとして意味があるかどうか見てみましょう。
最初と最後の時間を取り、それぞれのタイムスタンプの違いを見つけます。
635155978347870000 - 635155956336800000 = 22011070000 ティック
2 つの時間を区切る秒数で割ります ((37*60+14) - 33 == 2201 秒)
22011070000 ティック / 2201 秒 = 10000486.142662 ティック/秒
難読化していない限り、タイムスタンプは有用な間隔に基づいているため、適切な偶数に丸めます。したがって、あなたの場合、スケールは 1 秒あたり 1000 万ティック、つまり 1 ティックあたり 100ns のように見えます。
他のタイムスタンプ (この場合は 5:27:59 と 5:00:33) で確認します。
635155972798800000 - 635155956336800000 == 16462000000 ティック
16462000000 ティック / 10000000 ティック/秒 = 1646.2 秒
(27*60+59) - 33 == 1646 秒
したがって、100ns はほぼ正しいように見えます。ただし、確実にするには、タイムスタンプをさらに離す必要があります。これが、たとえば、年とその年の現在の秒を表す 2 つの 31 ビット数値ではなく、実際にカウントであることを確認するためです。
これがカウントであると仮定すると、最初のタイムスタンプを取得して 1,000 万で割ると、次のようになります。
635155956336800000 ティック / 10000000 ティック/秒 = 63515595633.6800000 秒
エポックから 635 億秒です。参考までに、32 ビットの署名付きタイムスタンプ (20 億を少し超える数) は、Unix エポック (1970 年) から 68 年後の 2038 年に使い果たされます。この数は約 29.58 倍、つまり 29.58 * 68 ~= 2011 年です。
それは、紀元1世紀の初め頃に時代を置きます. 1 CE は、エポック デートとして意味を成す十分に重要な日付です。ただし、それを確認するために計算を行う気はありません。
cHao の 1 秒あたり 10000000 ティックに対応しますが、最初に提案したように 01/01/0001 の基準日を使用します。
$values = array(
array(635155956336800000, "2013-9-24 05:00:33"),
array(635155957368670000, "2013-9-24 05:02:16"),
array(635155968617830000, "2013-9-24 05:21:10"),
array(635155968728200000, "2013-9-24 05:21:12"),
array(635155971811300000, "2013-9-24 05:26:21"),
array(635155972798800000, "2013-9-24 05:27:59"),
array(635155978347870000, "2013-9-24 05:37:14"),
);
function convert($date) {
static $monthArray = array(
31,29,31,30,31,30,31,31,30,31,30,31
);
$date = $date / 10000000 / 24 / 60 / 60;
$y = floor($date / 365.2425);
$YYYY = $y + 1;
$z = 365 * $y + floor($y/4) - floor($y/100) + floor($y/400);
$d = $date - $z;
$month = 1;
while (true) {
$d -= $monthArray[$month - 1];
if ($d < 0) break;
$month++;
$dd = $d;
}
$hh = ($dd - floor($dd)) * 24;
$hours = floor($hh);
$mm = ($hh - floor($hh)) * 60;
$minutes = floor($mm);
$ss = ($mm - floor($mm)) * 60;
$seconds = floor($ss);
return sprintf('%04d-%02d-%02d %02d:%02d:%02d', $YYYY, $month, floor($dd), $hours, $minutes, $seconds);
}
foreach($values as $value) {
echo convert($value[0]), PHP_EOL;
}
与えます:
2013-09-22 05:00:33
2013-09-22 05:02:16
2013-09-22 05:21:01
2013-09-22 05:21:12
2013-09-22 05:26:21
2013-09-22 05:27:59
2013-09-22 05:37:14
2 日間の不一致がどこから来るのかはわかりませんが、出力にはおそらく任意に 2 日間が追加される可能性があり、0 タイムスタンプ マークに近い非常に歴史的な日付で遊んでいない限り、おそらく十分でしょう。使用する機能