将 ISO 日期转换为 .net DateTime 时,Sitecore 8 出现奇怪的行为

Sitecore 8 strange behavior when converting ISO Date to .net DateTime

我有一个字段为“Birthday”的项目。值为“15/03/1977”,原始值为“19770315T000000”。我以 here

为例

现在下面代码的输出是:

var item = Sitecore.Context.Database.GetItem("{8935CD35-5EAD-4C8E-B85C-E95E9B1ED5C3}");
DateField dateField = (DateField)item.Fields["Birthdate"];
// DateTime object
var date = dateField.DateTime.Date;
 // String
lblTest.Text = date.ToString();

输出:

3/14/1977 12:00:00 AM // Instead of 15 here date is 14

如果我将字符串格式化为“dd-MM-yyyy”:

 lblTest.Text = date.ToString("dd-MM-yyyy");

输出

 14-03-1977 

我不知道为什么会有这种差异,保存的日期是15/03/1977,输出是14-03-1977

第二个问题是,在上面的代码 var date = dateField.DateTime.Date; 中,我将 .Date 分配给变量 date 但在输出中,如果没有提供格式,我仍然会看到时间。我说的是这个 lblTest.Text = date.ToString();

这可能是因为在 Sitecore 8 中向 DateTime 字段原始值添加了时区。

此博客中描述的类似问题 post: Sitecore 8 ServerTimeZone – my dates are all wrong

新格式的末尾包含 Z(例如 20160907T120740Z),它是 UTC 时间的 ISO 8601 日期时间标准的一部分,表示该时间是 UTC。

我不是 100% 确定这是否对您有帮助,但您可以尝试:

Sitecore.DateUtil.ToServerTime(dateField.DateTime).ToString("dd-MM-yyyy");

And second question is, in above code var date = dateField.DateTime.Date; I am assigning .Date to variable date but in the output I still see the time if no format is provided. I am talking about this lblTest.Text = date.ToString();

System.DateTime.Date属性仍然是一个DateTime对象,只是时间片段的默认值。如果你想丢失时间片段,你需要应用格式。