MOSS 2007: ошибка SPListItem.GetFormattedValue для полей DateTime? - PullRequest
6 голосов
/ 10 ноября 2008

SPListItem.GetFormattedValue, кажется, имеет странное поведение для полей DateTime. Он получает значение DateTime через индексатор SPListItem, который в соответствии с этой статьей MSDN возвращает локальное время. Вот фрагмент из Reflector

public string GetFormattedValue(string fieldName)
{
    SPField field = this.Fields.GetField(fieldName);
    if (field != null)
    {
        return field.GetFieldValueAsHtml(this[fieldName]);
    }
    return null;
}

Таким образом, он использует индексатор SPListItem для извлечения значения, а затем SPFields.GetFieldValueAsHtml для форматирования значения. GetFieldValueAsHtml, похоже, предполагает, что дата указана в формате UTC, и конвертирует ее в местное время, независимо от того, какой это тип. (Отражатель показывает, что он использует GetFieldValueAsText, который использует value.ToString (), но по какой-то причине он предполагает время в формате UTC.)

Конечным результатом является то, что строковое представление в поле времени, полученное через listItem.GetFormattedValue () (по крайней мере, в моем случае), является неправильным, и является местным временем + (местное время - UTC).

Кто-нибудь сталкивался с такой же проблемой с SPListItem.GetFormattedValue () и каков был ваш обходной путь?

Ответы [ 2 ]

7 голосов
/ 19 января 2009

Преобразование даты обратно в универсальное время перед вызовом GetFieldValueAsHtml прекрасно работает.

DateTime localTime = (DateTime)item["DueDate"];
// this is local time but if you do localDateTime.Kind it returns Unspecified
// treats the date as universal time.. 
// let's give it the universal time :)
DateTime universalTime = SPContext.Current.Web
    .RegionalSettings.TimeZone.LocalTimeToUTC(localTime);
string correctFormattedValue = 
    item.Fields["DueDate"].GetFieldValueAsHtml(universalTime);
0 голосов
/ 10 ноября 2008

У меня обнаружена ошибка с преобразованием даты из UTC в SharePoint. Это было исправлено в SP1.

...