2

MS Project(MPP)ファイルの解析に.NETのMPXJライブラリを使用していますが、うまく機能しています。私が抱えている問題の1つは、タスクの開始日と終了日をデータモデルで使用するために.NETDateTimeに変換しようとしていることです。

私はすべてのタスクを実行し、両方ともjavva.util.Dateオブジェクトを返すtask.getFinish()とtask.getStart()を呼び出しています。

task.getFinish()。getYear()、task.getFinish()。getMonth()などを使用して新しいDateTimeオブジェクトを作成すると、それらが廃止されたことを警告します。

MPXJから.NETDateTimeオブジェクトに開始日と終了日を取得するための最良の方法は何ですか?

ありがとう。

4

2 に答える 2

5

私はこれに2年以上遅れていることを知っていますが、あなたやこのスレッドを読んでいる他の人に役立つ場合は、この変換を処理するために(C#で)一緒に投げた簡単な小さな拡張メソッドを次に示します。

internal static DateTime ToDateTime(this java.util.Date javaDate)
{
    var cal = java.util.Calendar.getInstance();
    cal.setTime(javaDate);

    // note that the Month component of java.util.Date  
    // from 0-11 (i.e. Jan == 0)
    return new DateTime(cal.get(java.util.Calendar.YEAR),
                        cal.get(java.util.Calendar.MONTH) + 1,
                        cal.get(java.util.Calendar.DAY_OF_MONTH),
                        cal.get(java.util.Calendar.HOUR_OF_DAY),
                        cal.get(java.util.Calendar.MINUTE),
                        cal.get(java.util.Calendar.SECOND));
}
于 2013-01-22T00:18:06.367 に答える
3

私もMPXJを使用していますが、同じ問題がありました。これに対処するには、いくつかの方法があります。以下に 2 つの方法を概説します (私は両方を使用しましたが、どちらが優れているかはわかりません)。

Dim cal As New GregorianCalendar()
cal.setTime(task.getStart())

'have to add one to month value because it is 0 - 11
Dim startDate as New Date(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND))

これは、.getYear が時代遅れであると彼らが言うとき、彼らがあなたにそれをしてほしい方法です。

私が行ったもう 1 つの方法は、Java 日付を文字列に変換し、Date.Parse を使用してそれを .NET Date 変数に取得することです。Java Date が null になる可能性があるため、null 許容型を使用します。

Dim d as java.util.Date = t.getStart()
Dim startDate As New Nullable(Of Date)

If d IsNot Nothing Then
    Dim dateString As String = New java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d)

    startDate  = Date.Parse(dateString)
End If

すべての部分が必要ない場合、またはタイムゾーン情報を含めたい場合は、別の日付形式文字列を使用できます。Java のフォーマット文字列の選択肢のリストを次に示します。

アップデート

これを (文字列の解析よりも) 効率的に行う別の方法は、次のとおりです。

Dim startDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(d.getTime()).ToLocalTime();
于 2010-06-30T06:39:45.633 に答える