我遇到一个问题,当我从 VS2013 运行 Web 应用程序时,它会提供一种日期格式,而当我解决部署在 Azure 上的问题时,它会提供一种完全不同的日期格式。
这是一个例子: 顶部:在 Azure 上运行;底部:从 VS 本地运行 /image/qGiZQ.jpg
在浏览器中使用加拿大 (en-CA) 文化时会发生这种情况。
在出现在 UI 上之前,它们与所有其他数据一起作为字符串传递到自定义元素属性中,然后由 jquery 进行解析。
模型中的相关代码如下所示:
dynamic dynEffectiveStartDate
if (blah blah)
{
dynEffectiveStartDate = object.EffectiveStartDate.Value.ToString("MM/dd/yyyy");
}
else
{
dynEffectiveStartDate = DateTime.Today.ToString("MM/dd/yyyy");
}
var dataStruct = new
{
StartDate = dynEffectiveStartDate,
EndDate = dynEffectiveEndDate,
SomeStuff = anotherImportantDataString,
DataStore = someMoreImportantData
};
…
someObject.serializedData = javascriptserializer.Serialize(dataStruct);
…
后来我在 UI 中使用 $.datepicker.parsedate("mm/dd/yy", value) 将当前值传递给适当的编辑器,但它崩溃了,因为有破折号斜线。通常我会使用 $.datepicker.setDefault($.datepicer.regional[cultureVariable]); 为用户设置 UI 中的日期格式,然后使用 ("getDate") 和 $。 datepicker.formatDate("mm/dd/yyyy") 在发布之前将其记录回自定义属性。
因此,即使浏览器为英国人或澳大利亚人显示 31/12/2014,我仍然会将 12/31/2014 发回我的 Controller 。
然而,en-CA 文化代码在本地执行一件事,在远程执行另一件事。据我所知, DateTime.Today.ToString("MM/dd/yyyy"); 返回格式“MM-dd-yyyy”,这很令人烦恼,因为我需要将其解析为真正的日期稍后再说。如果中国或其他地方的人使用该应用程序,不知道它是否会开始输出“dd-mm-yyyy”或“yyyy/mm/dd”。
如何确保后端提供我告诉它的日期格式?
最佳答案
这里有很多我能想到的问题
1. DateTime.Now
- 这将为您提供不同的结果,具体取决于您将其部署到的位置。要解决此问题,请将时区保存在某些资源文件中或代码中的静态设置中,然后使用 DateTime.UtcNow.Add(*/时区差异*/)
2.您应该使用 DateTime.ToString(string,culture) see here 的重载。无论文化是什么,这都将使您的格式保持不变,因为现在您负责提供文化。所以现在您的代码应该类似于 .ToString("dd/M/yyyy", CultureInfo.InvariantCulture)
3. 使用文化相关格式将数据以 json 形式发送到 UI。 read this
4. 将文化相关的日期时间发送到 UI。只是我在项目中所做的一个建议是,我将 UTC 时间( ISO 8601 )发送到 UI,其中在 js 代码中更容易解析它,然后根据浏览器的时区更改它。如果没有这个,我将不得不猜测使用 IP 地址位置的用户的时区(完全不值得付出努力)。您可以仅使用 vanila js 轻松完成此操作,或者您可以使用一些 js 库(我使用的一个是 momentjs )
关于c# - .net 在本地主机和 azure 网站之间输出不同的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29288828/