2

我正在使用 .NET 中的 MPXJ 库来解析 MS Project (MPP) 文件,它运行良好。我遇到的一个问题是尝试将任务开始和完成日期转换为 .NET DateTime 以与我的数据模型一起使用。

我正在完成所有任务并调用 task.getFinish() 和 task.getStart() 两者都返回 java.util.Date 对象。

当我使用 task.getFinish().getYear()、task.getFinish().getMonth() 等来构建新的 DateTime 对象时,它会警告我它们已过时。

将 MPXJ 的开始日期和结束日期转换为 .NET DateTime 对象的最佳方法是什么?

谢谢。

4

2 回答 2

5

我知道我在这个方面迟到了两年多,但如果它对你或其他阅读这个线程的人有用,这里有一个简单的小扩展方法我放在一起(在 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 并且遇到了同样的问题。有几种方法可以解决这个问题。我将在下面概述两种方法(我都使用过,但不确定哪个更好):

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 已过时时,这就是他们希望您这样做的方式。

我完成的另一种方法是将 Java 日期转换为字符串,然后使用 Date.Parse 将其转换为 .NET Date 变量。我使用可为空的类型,因为 Java 日期可能为空。

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 回答