时区简单理解

https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA

上面的链接是时区的wiki说明,下面说说我记住的部分:

GMT时区是格林威治标准时间,我把它理解为 “真实时间”

UTC时区是根据GMT得来的“世界标准时间”,它的时间和GMT是相同的

CST可以指下列的时区:

澳洲中部时间,Central Standard Time (Australia)
中部标准时区(北美洲),Central Standard Time (North America)
北京时间,China Standard Time
古巴标准时间,Cuba Standard Time,参见北美东部时区

其中我们所在的时区背景时间  CST=UTC+8小时,也就是说,真实时间是0点的时候,背景时间是8点

ISO_8601日期格式标准

https://zh.wikipedia.org/wiki/ISO_8601

上面是日期格式标准的wiki

当前的UTC时间是2016-01-07T01:58Z,其中Z是4位数字格式的时间偏移量,不写的时候默认不偏移。

其中,字母T代表使用UTC时间,字母Z代表时间偏移量,实际写法中字母Z应该被偏移量替换,例如 "2017-1-7T10:21+0800"或者"2017-1-7T10:21-0800",字母Z被+0800和-0800替换了。

在浏览器中直接new一个date对象,因为我们处于UTC+0800的时区,所以控制台给我们打印出来的时间是GMT+0800的时间

2016-01-07T00:00 代表UTC时区1月7日0时0分(在控制台中显示UTC+0800时区为8时0分)

2016-01-07T00:00 0800 代表UTC+0800时区1月7日0时0分,2016-01-07T00:00 -0800 代表UTC-0800时区1月7日0时0分,在控制台中显示分别如下

通过日期字符串new一个Date对象,输入的时间字符串是2016-1-7 10:21,没有带ISO标准的“T”字母,因此浏览器认为我们想输入的是当地时间

HTML5 input标签datetime属性

下面问题来了,我要在页面上输入一个时间,存入数据库,上面说了那么多时区,那么用户在页面上输入的时间应该是哪个时区的呢,传到server,存入db的应该又是哪个时区的呢?

经测试

<input type="datetime"  />  chrome上是不支持的

<input type="datetime-local" /> chrome支持

Google了一下据说是因为datetime输入框输入的是本地时区,考虑到时区的问题chrome没有支持此输入类型,会降级为text类型

datetime-local输入类型chrome是支持的,获取的value格式是:

"2016-1-7T10:21"

如上面所述,这个时间是标准UTC时间,这种时间从前端到后台到存入db,都是不会发生错误的。

但是对用户来说,他填写表单的时候想的时间肯定是他所在位置的本地时间,比如我输入"2016-1-7 10:21",我真实想输入的时间是"2016-1-7T10:21+0800",而不是"2016-1-7T10:21"。

为了支持这种情况,我需要把"2016-1-7T10:21"转换为用户真实想要的当地时间"2016-1-7 10:21",于是"2016-1-7 10:21".replace("T"," "),它实际代表的真实时间(UTC时间)是"2016-1-7T10:21+0800"

这样在前端是没问题了,但是传到后端之后,这样的非ISO标准时间是没有携带时区信息的,服务器收到之后会将这个时间安装服务器所在时区来处理,处理之后所代表的真实时间就和用户输入的真实时间不同了。所以我们在前端得把时间转换为ISO标准时间格式再传给服务器,这样服务器就能明白用户输入的真正的时间了,另一种方法,也可以把时间用毫秒数表示,传到后端,不过这种方式可读性不太好。

// 1.将字面时间转化为本地时间  2.将本地时间转换为真实GMT时间传入后台
function getRealGMT(datetime){
datetime=datetime.replace("T"," ");
var temp=new Date(datetime);
var realGMT=temp.getTime()+temp.getTimezoneOffset()*60000;
return new Date(realGMT).format("yyyy-MM-ddThh:mm");
}
转换效果如下:

mysql时区

 
mysql可通过 show variables like '%time_zone%';命令来查看数据库设置的时区。我们的CST时区代表的是中国区的时区,即UTC+0800
所以服务器把从前端收到的ISO日期 "2016-1-7T02:21"收到之后,写入mysql的datetime字段,mysql的datetime字段会根据它的CST时区把日期转换过来,于是显示的日期就是"2016-1-7 10:21",代表的真实时间是"2016-1-7T10:21+0800"

ISO日期格式标准,浏览器到服务器到mysql中的时区的更多相关文章

  1. 日期格式操作,在oracle和mysql中的实现

    oracle add_months(日期格式值 , 整数n)  当整数n=12时,代表一年,向后推迟一年,若n=-12代表回退一年 如 to_char(add_months(to_date('2018 ...

  2. 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。

    可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...

  3. EXCEL日期格式要双击一下单元格才变正确格式

    今天遇到标题问题,问度娘后看到一个大神的解答,特此记录整理. 步骤1:在excel中把文本格式日期改为想要的日期格式 步骤2:在旁边空格中输入1,并设置成日期格式,变成1900/1/1: 步骤3:复制 ...

  4. Nullable<System.DateTime>日期格式转换 (转载)

    一.问题 1.html页面中时间显示出错,数据库中时间是正确的. 原因:没有把DateTime转成String类型. 2.  在C#中,发现不能直接使用ToString("yyyy-MM-d ...

  5. 机器学习入门-随机森林温度预测的案例 1.datetime.datetime.datetime(将字符串转为为日期格式) 2.pd.get_dummies(将文本标签转换为one-hot编码) 3.rf.feature_importances_(研究样本特征的重要性) 4.fig.autofmt_xdate(rotation=60) 对标签进行翻转

    在这个案例中: 1. datetime.datetime.strptime(data, '%Y-%m-%d') # 由字符串格式转换为日期格式 2. pd.get_dummies(features)  ...

  6. C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

  7. js 将long日期格式 转换为标准日期格式方法

    我们经常在操作的时候会发现从后台传递到view层的json中datetime类型变成了long型,当然你也可以从后台先转为string类型,但是如果是从和数据库对应的object中封装的话,就不能再去 ...

  8. 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值

    在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...

  9. SQL 将非标准日期格式转换成标准格式,进行条件判断

    a.JLDate为非标准日期格式: 例: 2011-8-28 0:00:000011-8-28 0:00:000111-8-4 0:00:00 select CONVERT(varchar(50),C ...

随机推荐

  1. [原]CentOS7.2部署node-mapnik

    转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...

  2. 微软Azure 经典模式下创建内部负载均衡(ILB)

    微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...

  3. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  4. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  5. 多线程条件通行工具——AbstractQueuedSynchronizer

    本文原创,转载请注明出处! 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> AbstractOw ...

  6. node模块加载层级优化

    模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载.但是随着应用规模的加大,目录层级越来越深,若是在某个 ...

  7. springmvc SSM shiro redis 后台框架 多数据源 代码生成器

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  8. JQuery的基础和应用

    <参考文档>   1.什么是?    DOM的作用:提供了一种动态的操作HTML元素的方法.    jQuery是一个优秀的js库.用来操作HTML元素的工具.    jQuery和DOM ...

  9. Android使用静默安装时碰见的问题

    升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...

  10. [转载]敏捷开发之Scrum扫盲篇

    现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP...      为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的话来讲述S ...