如何基于PjDateFormat将MS Project自定义字段日期字符串转为DateTime?
基于PjDateFormat将MS Project自定义字段日期字符串转换为DateTime类型
当然可以实现,核心思路是将PjDateFormat枚举值映射为对应的日期格式字符串,再用精确解析方法把字符串转成DateTime类型。以下是具体实现步骤和示例:
关键步骤
建立PjDateFormat与格式字符串的映射
MS Project的PjDateFormat枚举每个值对应固定的日期显示格式,你需要把已知的目标枚举值匹配到对应的格式字符串。比如你提供的示例格式"Tue 11/21/23 7:43 AM",对应的格式字符串是"ddd MM/dd/yy h:mm tt",对应的PjDateFormat通常是pjDateDayMonthYearTime(具体可根据你的MS Project设置确认)。使用精确解析方法转换
用DateTime.ParseExact或DateTime.TryParseExact(推荐后者,避免转换失败抛出异常),传入字段字符串、映射的格式字符串和对应的文化信息(示例是英文格式,用en-US)。
C# 示例代码
using Microsoft.Office.Interop.MSProject; using System.Globalization; using System.Collections.Generic; // 建立PjDateFormat到格式字符串的映射表 var dateFormatMapping = new Dictionary<PjDateFormat, string> { { PjDateFormat.pjDateDayMonthYearTime, "ddd MM/dd/yy h:mm tt" }, // 根据需要添加其他PjDateFormat对应的格式字符串 }; // 获取自定义字段的字符串值 Resource targetResource = ActiveProject.Resources["目标资源"]; string dateString = targetResource.GetField(PjField.pjResourceCustomDate1); // 已知的目标PjDateFormat PjDateFormat usedFormat = PjDateFormat.pjDateDayMonthYearTime; // 执行转换 DateTime parsedDate; if (DateTime.TryParseExact( dateString, dateFormatMapping[usedFormat], CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None, out parsedDate)) { // 转换成功,parsedDate即为所需的DateTime对象 } else { // 处理格式不匹配、转换失败的场景 }
VBA 示例代码
如果是在VBA环境中操作,思路类似:
Sub ConvertCustomDateField() Dim targetRes As Resource Dim dateStr As String Dim parsedDate As Date Set targetRes = ActiveProject.Resources("目标资源") dateStr = targetRes.GetField(pjResourceCustomDate1) ' 对应示例格式的格式字符串 Dim formatStr As String formatStr = "ddd MM/dd/yy h:mm AM/PM" ' 执行转换 On Error Resume Next parsedDate = CDate(Format(dateStr, formatStr)) On Error GoTo 0 If IsDate(parsedDate) Then ' 转换成功 Else ' 处理转换失败 End If End Sub
注意事项
- 确保格式字符串与
PjDateFormat对应的显示规则完全一致,比如星期缩写长度(ddd是三位缩写,dddd是全称)、年份位数(yy是两位,yyyy是四位)、时间制(12小时制带tt/AM/PM,24小时制用HH)。 - 文化信息要匹配字符串的语言(示例是英文,用
en-US;如果是中文格式,需用zh-CN等)。
内容的提问来源于stack exchange,提问作者P_rnd
相关产品推荐
相关产品推荐

