2

これは、グーグルで検索するのが難しいものです。100 万行の XML ドキュメントがあり、Ruby を使用してそれを解析し、重要でないエントリを削除しています。私の基準の 1 つは作成日です。これらの XML ブロックには変な日付が含まれています

<attribute name="datemodified" type="date">362895460.21263897418975830078</attribute>
<attribute name="datecreated" type="date">356831173.15324598550796508789</attribute>

日付がそのようにフォーマットされているのを見たことがありません。あなたがようなことをした場合、彼らは似ていますTime.now.to_f。それでも、それらをRuby DateTimeオブジェクトに変える方法がわかりません。これらの時間がどのように作成されるか、またはそれらが何を意味するかを特定できるなら、それは非常に役立ちます。

参考になれば、この XML ファイルはもともと「Things」と呼ばれる Mac OS X アプリケーションによって作成されたものです。

読んでくれてありがとう!

更新: さらに 2 つのエントリを作成し、それらを作成した時刻を記録しました。

2012 年 7 月 2 日 9:57 AM から

<attribute name="datemodified" type="date">362941035.01687598228454589844</attribute> 
<attribute name="datecreated" type="date">362940986.89370900392532348633</attribute>

2012 年 7 月 2 日 9:58 AM から

<attribute name="datemodified" type="date">362941107.69538801908493041992</attribute>
<attribute name="datecreated" type="date">362941080.53793197870254516602</attribute>

私は正確に秒に到達することができませんでしたが、私はそれらを約1分間隔で作成しました...これは、これらが実際には秒であるように見えます...しかし...いくつかのランダムな日付から. 多分開発者の誕生日:)

簡単な計算を行うと、ランダムな日付は 2000-12-31 16:09:43 -0800 前後、または記憶を容易にするためにおそらく 01/01/01 であることがわかります...そして 978336000 秒です。

4

2 に答える 2

3

このTime.atメソッドは、1970 年からの秒数をTimeインスタンスに変換します。

[1] pry(main)> Time.at 362895460.21263897418975830078
=> 1981-07-02 00:17:40 -0400

その日付が正しくなく、単位が秒の場合は、定数を追加して正しい日付にすることができます。

[2] pry(main)> Time.parse('2001-01-01') - Time.at(0)
=> 978325200.0
于 2012-07-02T16:45:35.017 に答える
0

数値は、整数部分がユリウス日で、小数部分が 1 日の分数であるように見えます。詳しくは調べていません。参考までに、「ジュリアン インスタント」から日付/時刻を変換するためのサクソン語のコードは次のとおりです。

public static DateTimeValue fromJulianInstant(/*@NotNull*/ BigDecimal instant) {
        BigInteger julianSecond = instant.toBigInteger();
        BigDecimal microseconds = instant.subtract(new BigDecimal(julianSecond)).multiply(DecimalValue.BIG_DECIMAL_ONE_MILLION);
        long js = julianSecond.longValue();
        long jd = js / (24L * 60L * 60L);
        DateValue date = DateValue.dateFromJulianDayNumber((int)jd);
        js = js % (24L * 60L * 60L);
        byte hour = (byte)(js / (60L * 60L));
        js = js % (60L * 60L);
        byte minute = (byte)(js / (60L));
        js = js % (60L);
        return new DateTimeValue(date.getYear(), date.getMonth(), date.getDay(),
                hour, minute, (byte)js, microseconds.intValue(),0 , true);
}

プラス

public static DateValue dateFromJulianDayNumber(int julianDayNumber) {
        if (julianDayNumber >= 0) {
            int L = julianDayNumber + 68569 + 1;    // +1 adjustment for days starting at noon
            int n = (4 * L) / 146097;
            L = L - (146097 * n + 3) / 4;
            int i = (4000 * (L + 1)) / 1461001;
            L = L - (1461 * i) / 4 + 31;
            int j = (80 * L) / 2447;
            int d = L - (2447 * j) / 80;
            L = j / 11;
            int m = j + 2 - (12 * L);
            int y = 100 * (n - 49) + i + L;
            return new DateValue(y, (byte) m, (byte) d, true);
        } else {
            // add 12000 years and subtract them again...
            DateValue dt = dateFromJulianDayNumber(julianDayNumber +
                    (365 * 12000 + 12000 / 4 - 12000 / 100 + 12000 / 400));
            dt.year -= 12000;
            return dt;
        }
    }
于 2012-07-02T20:04:21.360 に答える