-3

この 635151121709530000 の時刻形式と変換方法を教えてください。結果は 2013-9-18 14:42:50 のようになります

ありがとう

4

2 に答える 2

1

数値を時間に変換するのに十分な情報がありません。 特定の時点を表すには、少なくとも 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 は、エポック デートとして意味を成す十分に重要な日付です。ただし、それを確認するために計算を行う気はありません。

于 2013-10-02T18:29:32.550 に答える
0

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 タイムスタンプ マークに近い非常に歴史的な日付で遊んでいない限り、おそらく十分でしょう。使用する機能

于 2013-10-02T22:27:49.657 に答える