当我们选择活动的日期和时间时,Sitecore中的当前日期/时间选择器会假定CM服务器的本地系统时间(在我们的情况下是东部标准/日光时间)。
很明显,我们需要一种方法让内容作者为事件选择时区。最初,我们决定提供 Droplist 的预定义时区缩写,例如“PST”,“EST”,“EDT”等。虽然此解决方案可以正常显示,但我们立即遇到了问题尝试动态生成事件的.ICS日历约会。
为了生成.ICS文件,我们需要一种方法将Event的开始和结束日期(也就是EST或EDT)和时区缩写(EST,PST等)组合成一个UTC DateTime对象。
我的理解是 ASP.NET does not support timezone abbreviations ,所以我认为我们不得不维护缩写列表及其UTC偏移值。仅仅为我们的内容作者提供GMT -08:00,GMT -07:00等时区列表是不够的,我们需要包含某种缩写或名称来帮助他们进行选择。
Sitecore是否有用于选择时区的内置字段或实用程序?
答案 0 :(得分:6)
Sitecore没有用于存储时区的内置模板,但您可以轻松创建自己的模板来执行此操作。我建议您将Droplist
更改为Droplink
(删除列表按名称引用引用的项目,droplink通过GUID引用引用的项目),然后为源创建新模板。您的新模板可以称为时区。每个项目的名称可以是友好名称(例如EDT,PDT等),项目上可以有一个字段,偏移。在您的代码中,当您确定从现在 Droplink 中选择的项目时,您可以访问其上的“偏移”字段以确定实际偏移量。像这样:
ReferenceField timezoneSelected = item.Fields["Timezone"];
string offsetVal = timezoneSelected.TargetItem.Fields["Offset"].Value;
// parse out the true value from offsetVal
答案 1 :(得分:3)
“在Sitecore 8.0及更高版本中,只应将UTC日期/时间值保存到数据库中。” https://doc.sitecore.net/sitecore_experience_platform/setting_up_and_maintaining/utc/datetime/storing_datetime_values_in_databases
更多关于此事: https://doc.sitecore.net/sitecore_experience_platform/utc?sc_lang=en
答案 2 :(得分:1)
尝试以UTC格式保留所有日期/时间,并在渲染时将其转换为EST,PTS等。通过使用.Net TimeZoneInfo类,您可以在渲染时将存储的UTC值简单地转换为合适的时区。这也将解决日光节省问题。
Sitecore对此没有太多支持,但为了让内容作者更容易,您可以扩展Sitecore DateTime字段,以便在输入时将时区下拉列入 CMS。扩展字段类型应处理UTC和内容作者首选时区之间的转换。
您还可以扩展用户个人资料,以便内容作者可以存储他们的首选时区。您还应该在UTC时间运行服务器,但由于您已经使用EST,因此更改它可能不是一个好主意。
答案 3 :(得分:1)
另外值得一提的是,如果你的地理位置分布很少的服务器,你不应该只使用UTC,而是同步。这适用于包括DMS和xDB实例在内的所有内容。
如果没有,它会破坏事件队列和远程事件(如发布),因为它们都通过核心数据库工作,并且(默认情况下)检查新事件(实际上它是具有适当时间戳的数据库中的记录。)