格式化日期时间:SPUtility.FormatDate

作者:杨柳@水杉网络

基本信息

程序集

Microsoft.SharePoint.dll

命名空间

Microsoft.SharePoint.Utilities

类型

静态方法

介绍

在SharePoint中,有自己特别的日期时间格式:SPDateFormat,此方法就是把System.DateTime系统时间转换为SPDateFormat格式的字符串。

方法

位于Microsoft.SharePoint.Utilities.SPUtility类,具体描述如下:

//格式化System.DateTime为SPDateFormat格式字符串。
public static string FormatDate(SPWeb web, DateTime date, SPDateFormat fmt)
{
    return FormatDate(web, date, fmt, true);
}
//供上一个方法调用,此方法多传递一个参数toWebLocalTime:是否转换为SPWeb本地时间。
internal static string FormatDate(SPWeb web, DateTime date, SPDateFormat fmt, bool toWebLocalTime)
{
    SPContext context = SPContext.GetContext(web);
    return FormatDate(web, date, (SPCalendarType) context.RegionalSettings.CalendarType, fmt, toWebLocalTime);
}
//真正落地执行的方法,相对于Public的方法来讲,多了SPCalendarType和toWebLocalTime参数。
private static string FormatDate(SPContext context, DateTime date, SPCalendarType calendarType, SPDateFormat fmt, bool toWebLocalTime)
{
    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    if (toWebLocalTime)
    {
        date = context.RegionalSettings.TimeZone.UTCToLocalTime(date);
    }
    SimpleDate di = new SimpleDate(date.Year, date.Month, date.Day);
    if (SPCalendarType.Gregorian != calendarType)
    {
        int jDay = SPIntlCal.LocalToJulianDay(SPCalendarType.Gregorian, ref di);
        SPIntlCal.JulianDayToLocal(calendarType, jDay, ref di);
    }
    if (fmt != SPDateFormat.MonthDayOnly)
    {
        return context.RegionalSettings.DateOptions.GetDowLongDateString(di);
    }
    if ((context.Web != null) && (context.Web.WebTemplateId == 9))
    {
        context.RegionalSettings.DateOptions.MonthDayPattern = (context.Web.UIVersion == 4) ? "MMMM dd" : "MMM dd";
    }
    return context.RegionalSettings.DateOptions.GetMonthDayDateString(di);
}

使用场景

SharePoint在数据库中存储的时间为UTC格式,所以在获取使用过程中,有可能需要转换为本地时间,另外更多地需求就是按照SharePoint特定场景规定的格式显示(SPDateForm)。

比如下面截取了Microsoft.SharePoint.SPFieldDateTime类中使用此方法的方式:

//转换SPFieldDateTime字段值为SPDateFormat格式文本
public static string GetFieldValueAsText(DateTime data, SPWeb web, SPDateFormat dateformat)
{
    return SPUtility.FormatDate(web, data, dateformat);
}

测试代码

以下代码在SharePoint Powershell命令行工具中执行

# 根据实际情况替换WebUrl
$web = Get-SPWeb http://loalhost
# 当前系统时间
$d = [System.DateTime]::Now
#####
# 输出结果:2015/7/2 23:04
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::DateTime);

#####
# 输出结果:2015/7/2
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::DateOnly);

#####
# 输出结果:23:06
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::TimeOnly);

#####
# 输出结果:2015-07-02T23:07:27Z
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::ISO8601);

#####
# 输出结果:7月2日
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::MonthDayOnly);

#####
# 输出结果:2015年7月
# 注意,输出结果受$d变量和当前SharePoint环境影响。
#####
[Microsoft.SharePoint.Utilities.SPUtility]::FormatDate($web, $d, [Microsoft.SharePoint.Utilities.SPDateFormat]::MonthYearOnly);