MVC中的日期和时区管理

时间:2018-02-01 05:48:16

标签: c# asp.net-mvc date datetime

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

    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 

2 个答案:

答案 0 :(得分:1)

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

  • 将所有日期转换为UTC,然后再将其保存到数据库中。
  • 从数据库中提取它们以便显示时,将所有日期转换回本地时间。

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

  • 数据库中的所有日期必须为UTC。
  • .Net代码中的所有日期必须为UTC。
  • .Net中没有日期转换。
  • 所有显示日期均以当地时间为准。
  • 所有日期转换必须以JavaScript完成。
  • 客户端和服务器端之间的所有日期传输必须采用相同的格式,并建议采用通用标准格式。

现在,了解所有这些,这里是实用点(我的食谱):

  • 当您需要在服务器上生成要保存在数据库中的当前日期时,请使用DateTime.UtcNow。对于非来自客户端的日期,这是必需的。例如,如果要记录操作时间。我更喜欢在应用程序中执行此操作,但如果您希望直接在数据库中执行此操作,请使用以UTC格式生成当前时间的数据库函数。

  • 我建议使用可排序的日期&amp;时间格式,因为JavaScript和.Net都理解它。但是,有一点不同。 JavaScript最后会添加Z,但这很容易解决。例如,2009-06-15T13:45:30在.Net中将是2009-06-15T13:45:30Z的JavaScript。

  • 如果您想将UTC日期从.Net发送到JavaScript,请使用:

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

JavaScript会自动将其转换为本地时间。美丽,不是吗?

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

答案 1 :(得分:0)

我遇到了类似的日期时间问题,这对我的Global.asax有帮助: -

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中的格式