MPXJ в .NET конвертирует Java-дату в .NET DateTime - PullRequest
2 голосов
/ 17 июня 2010

Я использую библиотеку MPXJ в .NET для анализа файлов MS Project (MPP), и она прекрасно работает. Единственная проблема, с которой я столкнулся - это попытка перевести дату начала и окончания задачи в .NET DateTime для использования с моими моделями данных.

Я выполняю все задачи и вызываю task.getFinish () и task.getStart (), которые оба возвращают объекты javva.util.Date.

Когда я использую task.getFinish (). GetYear (), task.getFinish (). GetMonth () и т. Д. Для создания нового объекта DateTime, он предупреждает меня об их устаревании.

Каков наилучший способ получить даты начала и окончания MPXJ в объект .NET DateTime?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 января 2013

Я знаю, что опоздал с этим на два года, но в случае, если это полезно для вас или кого-либо еще, читающего эту ветку, вот простой метод расширения, который я использовал вместе (в 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));
}
3 голосов
/ 30 июня 2010

Я также использую 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. Я использую тип NULL, потому что дата 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();
...