首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC中的日期和时区管理

MVC中的日期和时区管理
EN

Stack Overflow用户
提问于 2018-02-01 13:48:16
回答 2查看 1.7K关注 0票数 1

我对在c#中使用区域性不变量的正确方法感到困惑,在托管应用程序时,我包含<globalization uiCulture="en-IN" culture="en-IN" />的日期和时间似乎有一些错误,一切正常。但在迁移到云弹性豆茎的应用程序再次失败,所以我再次包括<globalization uiCulture="en-IN" culture="en-IN" />,但在其他时区失败,除了印度,日期选择器选择的日期传递给控制器使用ajax代码,传递到数据库操作的存储过程,应用程序如何工作!但是在数据库中输入的日期似乎是错误的(01-01-0001)。处理datetime的正确方法是什么?哪一项适用于所有时区?我尝试采用当前的区域性,但该方法不起作用,因为我的查询不是关于代码方面的错误,我没有添加任何代码

代码语言:javascript
复制
    public JsonResult CreateAcademicInfo(CreateCommand create)
    {
            return Json(_academicInfo.CreateClass(create),JsonRequestBehavior.AllowGet); 


} .// controller



private bool CreateAcademicInfo(CreateCommand createAcademicInfo, IDbUtility dbObj)
        {

                ISumDbCommand cmdcreateAcademicInfo =
                    dbObj.CreateCommand("uspAddInformations", CommandType.StoredProcedure);
                cmdcreateAcademicInfo.AddParameter("HierarchyStructureName", SumDbType.String,
                    createAcademicInfo.HierarchyStructureName);
                 cmdcreateAcademicInfo.AddParameter("MaximumCount",SumDbType.Integer,createAcademicInfo.MaximumCount);
                cmdcreateAcademicInfo.AddParameter("StartDate",SumDbType.DateTime,createAcademicInfo.StartDate);
                cmdcreateAcademicInfo.AddParameter("EndDate",SumDbType.DateTime, createAcademicInfo.EndDate);
                int errorCode = dbObj.StoredProcExecute(cmdcreateAcademicInfo.DbCommand);
                if (errorCode != 0)
                {
                    throw new Exception.DbOperationException($"Error {errorCode} occurred = {dbObj.LastError}");
                }
                return true;


        } //API 
EN

回答 2

Stack Overflow用户

发布于 2018-02-01 15:12:21

没有足够的信息可以为您提供特定于您的代码的答案,但以下是概要:

在将所有日期保存到database.

  • Convert之前,
  • 将所有日期转换为协调世界时时间。当您从数据库中提取日期以进行显示时,所有日期将恢复为本地时间。

现在请记住,本地时间意味着用户所在区域的时间,所以只有客户端上运行的代码知道用户的本地时间。您的.Net代码在服务器上运行,并且不知道用户的本地时间。有一些方法可以在服务器上获取用户的时区,但它并不总是可靠的,所以最好在客户端使用JavaScript。这意味着:

  • 数据库中的所有日期必须为协调世界时。
  • 您的.Net代码中的所有日期都必须为协调世界时。
  • .Net中不执行日期转换。
  • 显示的所有日期都为本地时间。

< code >H119所有日期转换必须在UTC中完成。客户端和服务器端之间的日期传输必须采用相同的格式,并且建议使用通用标准格式。

现在,理解了所有这些,这里是实用的要点(我的秘诀):

  • 当您需要在服务器上生成要保存在数据库中的当前日期时,请使用DateTime.UtcNow。对于不是来自客户端的日期,这是必需的。例如,如果您想要记录操作时间。我更喜欢在应用程序中执行此操作,但如果您更喜欢直接在数据库中执行此操作,请使用以UTC格式生成当前时间的数据库函数。
  • 我建议使用可排序的日期和时间格式,因为JavaScript和.Net都能理解它。然而,有一点不同。JavaScript在末尾添加了Z,但这很容易补救。例如,在JavaScript.
  • When中,2009-06-15T13:45:30将是2009-06-15T13:45:30Z在.Net中,如果要将.Net中的协调时日期发送到JavaScript,请使用:

var date = new Date("@mydate.ToString("s")Z");

JavaScript会自动将其转换为本地时间。很漂亮,不是吗?

  • 当您想要将本地日期从JavaScript发送到.Net时,使用.toJSON()方法。它将使用可排序的日期和时间格式格式化它,并自动将其转换为UTC。美的东西。然后,在.Net中,您可以使用一个DateTime函数来解析字符串(例如DateTime.Parse()).
票数 5
EN

Stack Overflow用户

发布于 2018-02-01 14:36:35

我遇到了类似的与日期时间相关的问题,这对我有帮助,在你的Global.asax中:

代码语言:javascript
复制
protected void Application_Start()
{
    CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
    newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    newCulture.DateTimeFormat.DateSeparator = "/";
    Thread.CurrentThread.CurrentCulture = newCulture;
}

protected void Application_BeginRequest()
{
    CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
    newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    newCulture.DateTimeFormat.DateSeparator = "/";
    Thread.CurrentThread.CurrentCulture = newCulture;
}

这将集中设置应用程序的日期时间格式和区域性,还可以使用jquery集中设置日期时间选择器的格式,使其与Global.asax中的格式相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48556149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档