6

SPListItem.GetFormattedValue 似乎对 DateTime 字段有一个奇怪的行为。它通过 SPListItem 的索引器检索 DateTime 值,根据此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 并将其转换为本地时间,无论它是什么类型。(Reflector 显示它使用 GetFieldValueAsText,它使用 value.ToString() 但由于某种原因,它假定时间为 UTC。)

最终结果是通过 listItem.GetFormattedValue() 获得的时间字段上的字符串表示(至少在我的情况下)不正确,是本地时间 +(本地时间 - UTC)。

有人遇到过与 SPListItem.GetFormattedValue() 相同的问题吗?您的解决方法是什么?

4

2 回答 2

7

在调用 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);
于 2009-01-19T10:20:48.523 回答
0

我在 SharePoint 中从 UTC 转换日期时遇到了一个公认的错误。它已在 SP1 中修复。

于 2008-11-10T19:45:43.870 回答