1

Easy-IPから抽出したXMLデータの日付とタイムスタンプを変換する必要があります。生の値を認識できません。浮動小数点値のように見えますが、UNIXスタイルには整数部分が小さすぎます。

このタイプのシステムから抽出されたデータに再び遭遇する可能性があるため、データベースへの直接アクセスに依存しない標準的な変換方法が必要です(異なる場合やアクセスできない場合があります)

バックエンドデータベースはFirebirdだと思いますが、彼らのドキュメントによると、1753年1月1日からカウントアップを開始します。

いくつかのサンプル値(各行は異なるエンティティです)。これらはすべて、過去15年間に発生したアクティビティを参照している必要があり、おそらくはるかに最近のものです。

CREATED="39660.2632087847" UPDATED="39660.2632160185"
CREATED="39660.2631284838" UPDATED="39750.4032429514"
FIRST_SUCCESSFUL_CONTACT="39668.128960544"  LAST_SUCCESSFUL_CONTACT="41301.0505147685"
FIRST_SUCCESSFUL_CONTACT="39668.1289603588" LAST_SUCCESSFUL_CONTACT="41301.0505142245"

私の望みは、他の誰かがこれを以前に見たことがあることであり、パズルを解かないことです。XSL、Java、または(あまり好ましくない)PERLを使用して日付+タイムスタンプに変換する信頼できる方法がある場合は、ボーナスポイント。

4

2 に答える 2

2

私の推測では、値は内部のDelphiTDateTime表現から取得されます。

Delphiプログラムは、内部的にTDateTime値を浮動小数点値として表し、整数部分は1899年12月30日からの日数を表し、小数部分は深夜からの日の小数部です。

したがって、たとえば、

  • 39660Jul-31-2008
  • 0.26320878476:19:01.239 AM

したがって、最初の例は2008-07-31 06:19:01

データが日付の内部Firebird表現であるとは思わないので、元のシステムでもTimeStampデータ型は使用されていませんが、日付を格納するために倍精度またはその他の数値型が使用されていると思います。

とはいえ、日付を変換する最も簡単な方法は、Delphiでプログラムを作成して、日付の表現を変更することです。たとえば、表示された日付を計算するために、私は次のように書きました。

procedure TForm1.Button1Click(Sender: TObject);
var
  Dt: TDateTime;
begin
  Dt := 39660.2632087847;
  ShowMessage(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', Dt));
end;

Delphiが手元にない場合は、同様の表現を使用する他のツールがあります。運が悪ければ、自分で数学を行うためのすべての情報が得られます。UnixTimeへの変換は特に難しくありません。

于 2013-02-26T08:03:48.673 に答える
0

このJavaの変換の正確な例は見つかりませんでした。これが私が使用するものの簡略化されたバージョンです:

public static String convertEasyIPTime (double dateTimeDouble, String timeZoneCode) {

  TimeZone tz = TimeZone.getTimeZone(timeZoneCode);

  long days = (long) dateTimeDouble;
  long adjustedDays = days - 25569; // Days between Jan 1st 1753 (Delphi) and Dec 31st 1970 (Java)

  long datePortion = adjustedDays * 24 * 60 * 60 * 1000;
  long timePortion =  (long) ((dateTimeDouble - days) * 60 * 60 * 24 * 1000);

  int zoneAndDSTOffset = tz.getOffset(datePortion);

  Date output = new Date (datePortion + timePortion - zoneAndDSTOffset);
  DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");  
  formatter.setTimeZone(TimeZone.getTimeZone(timeZoneCode)); 
  return formatter.format(output);
}

それを呼び出すサンプル:

System.out.println(convertEasyIPTime (39940.1295844213d, "CST"));
于 2013-03-01T21:13:04.493 に答える