【问题标题】:How to parse a angular-ui dateTime string to c# datetime如何将 angular-ui dateTime 字符串解析为 c# datetime
【发布时间】:2015-02-08 21:19:14
【问题描述】:

我知道很多关于此的问题已得到解答。我已经尝试了大约 3 个小时,但没有运气。我正在使用 angular-ui 日期时间选择器,格式为

“2015-02-08T06:00:00.000Z”

错误消息是字符串未被识别为日期时间

at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style) 在 System.DateTime.ParseExact(String s,String 格式,IFormatProvider 提供程序) 在 c:\Development\TransparentEnergy\TransparentEnergy\ControllersAPI\apiDocumentController.cs:line 67 中的 TransparentEnergy.Controllers.apiDocumentController.d__2.MoveNext() 处

控制器

 string docDate = provider.FormData["DocumentDate"];
 model.DocumentDate = DateTime.ParseExact(docDate, "yyyy-MM-dd'T'HH:mm:ss'Z'", CultureInfo.GetCultureInfo("en-US"));

Angular-UI

 $scope.open = function ($event) {
    $event.preventDefault();
    $event.stopPropagation();

    $scope.opened = true;
};
$scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
$scope.format = $scope.formats[3];

更新

 string docDate = provider.FormData["DocumentDate"];
            model.DocumentDate = DateTime.ParseExact(docDate, "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

【问题讨论】:

    标签: c# angularjs datetime


    【解决方案1】:

    您不使用 DateTime.Parse() 是否有任何具体原因?

    您指定的格式"2015-02-08T06:00:00.000Z" 是ISO 日期时间格式。参考http://en.wikipedia.org/wiki/ISO_8601

    你显示的是UTC时间和你使用的时间

    DateTime.Parse("2015-02-08T06:00:00.000Z")
    

    你得到当地的日期时间。根据您正在运行代码的服务器 \ pc 的时区。

    你可以使用

    DateTime.Parse("2015-02-08T06:00:00.000Z").ToUniversalTime()
    

    获取 UTC。有帮助吗?

    【讨论】:

    • 没有理由。只是尝试了与示例不同的东西。这是字符串 docDate 断点 "\"2015-02-03T06:00:00.000Z\"" 处的时间格式
    • DateTime.Parse("2015-02-08T06:00:00.000Z").ToUniversalTime() 给出了同样的错误
    • @texas697 所有代码示例都会出错。原因是字符串中的引号。我同意 Jon Skeet 的观点,即应该有引号。理想情况下,您应该摆脱源本身的引号。但是,如果您想暂时修补代码,可以使用 DateTime.Parse("\"2015-02-03T06:00:00.000Z\"".Trim('"') )。即 DateTime.Parse( docDate.Trim('"') )
    【解决方案2】:

    看看你传递的格式:

    "yyyy-MM-dd'T'HH:mm:ss'Z'"
    

    这没有毫秒,而您的样本是"2015-02-08T06:00:00.000Z"确实有毫秒。看起来像你想要的:

    "yyyy-MM-dd'T'HH:mm:ss.fff'Z'"
    

    另外,我建议使用 CultureInfo.InvariantCulture 而不是美国文化 - 在这种情况下它们的工作方式相同,但我认为当你基本上在谈论机器时使用不变文化更清楚 -到机器格式。

    您还应该包含DateTimeStyles.AssumeUniversal 以考虑Z

    【讨论】:

    • 仍然出现同样的错误。我用你的代码更新了我的问题
    • @texas697:当docDate 为“2015-02-08T06:00:00.000Z”时,您发布的代码可以正常工作 - 我刚刚尝试过。您对要解析的值的确定程度如何?理想情况下,发布一个简短但完整的程序来演示问题
    • 这是来自字符串 docDate "\"2015-02-03T06:00:00.000Z\"" 处的断点
    • 对,所以它在开头和结尾都包含引号 - 但目前尚不清楚为什么。我建议您查看执行帖子的代码;我不希望它在价值中。
    【解决方案3】:

    试试这个格式

    yyyy-MM-dd'T'HH:mm:ss.fff'Z'
    
      var date = DateTime.ParseExact("2015-02-08T06:00:00.000Z", "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture);
    

    【讨论】:

    • 这是字符串 docDate 断点 "\"2015-02-03T06:00:00.000Z\"" 处的时间格式
    • 例如,您的更新部分中的代码在我的 VS 中无一例外地工作。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 2011-07-18
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多