Format 1. Sun, 09 Oct 2016 13:24:35 GMT
Format 2. Sun, 9 Oct 2016 13:36:09 UTC

Format 1 是在IE里面产生的(Windows10下的Edge和IE已经使用Format2)
Format 2 是Edge/Firefox/Safari/Chrome等产生的格式(这么说不太严谨,应该带上版本号)
那么采用DateTime.TryParse,Format 1会报错,而Format 2会成功。

我们先看一下C#下DateTime的格式,打开TryParse的文档,很长,似乎看不懂。用ILSpy查一下源代码,在代码中,我们似乎只能找到GMT字眼,却找不到UTC字眼。

通过代码,我们知道了这样的格式,C#DateTime中微软遵循了RFC1123标准(从这里扒出来的线索),我们找到RFC1123 第5.2.14节文档,5.2.14 Date and Time Specification章节,发现它引用的是RFC822 第5节的内容,在里面关于zone的内容中,只提及了GMT作为关键字,并没有使用UTC的字眼。

但是在IE中微软toUTCString方法,仅提到了UTC时间,并没有提到Format 1和Format 2之间的差异以及版本变更,在IE的版本变更信息中也没有提及具体的变化细节。

我们尝试从其它浏览器的文档里面找到蛛丝马迹,于是来到了FireFox的官方文档。在文档中,我们找到了ECMAScript 5.1ECMAScript 6的文档,其实二者没有区别,只是一个已定稿一个是在草稿状态。它们提到的格式说明在这里。文中,提到是基于ISO 8601标准进行实现的。但是我们可以发现ISO 8601所定义的标准,大多是YYYY-MM-DDTHH:mm:ss.sssZ格式的,其中的Z并不是GMT也不是UTC。

注意到在IE9和其它浏览器中都支持toISOString方法,这个方法,返回的正是以上格式的数据。
再回到toUTCString的各种定义,我们会发现一句话叫:生成人类可读易读的格式,比如C# DateTime的ToString可以传递格式o或者r,而且除了RFC1123中明确提到GMT字眼外,其它地方并未提到UTC,既然是给人阅读的,人是聪明且智能的,GMT还是UTC大家都能看懂,但是我们的命题其实是给机器读的。这个时候,我们更建议使用ISO 8601的YYYY-MM-DDTHH:mm:ss.sssZ在不同的系统间进行传递,既能表现世界时,又能保证各种程序转换的正确性。

临时解决办法:

既然IE旧版中的toUTCString方法,所产生的数据仅是UTC字眼和GMT字眼的差异,那么在进行TryParse之前,替换一下字符即可。注意一点,在IE中,如果“日”为1位数的话,比如是10月9日,那么可能显示的是9 Oct,这个在ECMA的标准中,还是明确提到要补齐为“09”,不过对于C#的DateTime.TryParse,则没有什么影响。

在浏览器的JavaScript里new Date().toUTCString()后,传递给C# DateTime().TryParse()会发生什么?的更多相关文章

  1. JavaScript里的Date 对象属性及对象方法--实现简单的日历

    上网搜索"js 日历插件"就会出来各种效果的功能丰富的日历插件,很多都可以下载源码,然后根据各自的需求对源码进行修改就可以直接用了. 但今天讲的不是如何使用这些插件,而是讲如何实现 ...

  2. JavaScript 字符串 & Math & Date

    字符串 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中. 'abc' "abc" 单引号字符串的内部,可以使用双引号.双引号字符串的内部,可以使用单引号. 'key=& ...

  3. JavaScript 里的 'this' 的一般解释

    本文旨在帮助自己和大家理解 JS 里的 this, 翻译.整理并改写自本人关注的一个博主 Dmitri Pavlutin,原文链接如下: https://dmitripavlutin.com/gent ...

  4. 如何才能通俗易懂的解释javascript里面的"闭包"?

    看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...

  5. chrome浏览器下JavaScript实现clipboard时无法访问剪切板解决方案

    在用JavaScript实现某个简单的复制到剪切板功能的时候,会考虑一下浏览器兼容性,主要是重点在IE和FireFox,把这个两个浏览器搞定后,基本上其他浏览器也不用太操心了,Chrome也一样,没出 ...

  6. JavaScript 里,$ 代表什么?/JQuery是什么语言?/html中用link标签引入css时的中 rel="stylesheet"属性?/EL表达式是什么?

    JavaScript 里,$ 代表什么? 比如说我写一个mouseover事件: $(document).ready(function(){ $("p").mouseover(fu ...

  7. JavaScript高级编程——Date类型

    JavaScript高级编程——Date类型 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...

  8. JavaScript里的循环方法之forEach,for-in,for-of

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  9. javascript里的sleep()方法

    很多编程语言里都有sleep(),delay()等方法,它能让我们的程序不那么着急的去执行下一步操作,而是延迟.等待一段时间.软件开发中经常会遇到需要这样的函数,比如等待几分钟去检查某一事件是否发生. ...

随机推荐

  1. SQLSERVER进程CPU使用率100%

    解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , ...

  2. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  3. C#中的线程(一)入门

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

  4. 用VLC Media Player搭建简单的流媒体服务器

    VLC可以作为播放器使用,也可以搭建服务器. 在经历了Helix Server和Darwin Streaming Server+Perl的失败之后,终于找到了一个搭建流媒体简单好用的方法. 这个网址中 ...

  5. python 类变量 在多线程下的共享与释放问题

    最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大 1.python 类变量 在多线程情况 下的 是共享的 2.python 类变量 在多线程情况 ...

  6. .NET 4.0 中超长路径超长文件名的问题

    1. 昨天开发中遇到一个问题,场景如下: 客户端从服务器下载一个文件并解压,客户端在使用后需要做清理操作(删除解压出来的文件),结果删除失败,抛出如下异常: The specified path, f ...

  7. Spring Boot + Bootstrap 出现"Failed to decode downloaded font"和"OTS parsing error: Failed to convert WOFF 2.0 font to SFNT"

    准确来讲,应该是maven项目使用Bootstrap时,出现 "Failed to decode downloaded font"和"OTS parsing error: ...

  8. grep笔记

    grep "match_text" file1 file2 file3 ...                        #grep可以对多个文件进行过滤 --color   ...

  9. Ubuntu下deb包的安装方法 (zz)

    Ubuntu下deb包的安装方法 分类: Ubuntu10使用技巧 2010-10-11 23:49 42969人阅读 评论(3) 收藏 举报 ubuntudebdebianlinux deb是deb ...

  10. app.js

    //第一步,引入express模块 var exp = require('express'),     http = require('http'),//引入http模块     path = req ...