MPXJ在.NET中将java Date转换为.NET DateTime

时间:2010-06-17 01:38:03

标签: .net java-interop mpxj

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

我正在完成所有任务并调用task.getFinish()和task.getStart(),它们都返回javva.util.Date对象。

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

从MPXJ到.NET DateTime对象的开始和结束日期的最佳方法是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

我知道我迟到了两年,但是如果它对你或其他读这个帖子的人有用,这里是一个简单的小扩展方法,我把它放在一起(在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));
}

答案 1 :(得分: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 Date可以为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

如果您不需要所有部件,或者您想要包含时区信息,则可以使用其他日期格式字符串。这是format string choices for Java的列表。

<强>更新

另一种可能更有效的方法(比字符串解析)如下:

Dim startDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(d.getTime()).ToLocalTime();