
function curTime(){
var current = new Date();//获取当前时间
var today = new Date(currentgetFullYear()+'/'+(currentgetMonth()+1)+'/'+currentgetDate()+' '+'8:30')//今天的8:30
return parseInt(Mathabs(todaygetTime()-currentgetTime())/1000);//返回当前时间到今天8:30(早上)的时间差(总为正数,若需要正负数都有将Mathabs去掉)
}
getTime()返回的已经是一个UTC的unix timestamp秒数了,与时区无关;而转换为字符串后,就和时区相关了
对于这个秒数,不同时区的人,按照自己所在的时区去解析,就可以得到正确的时间了:
你还在被以下问题困扰吗:
MySQL 的安装规范中应该设置什么时区?
JAVA 应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?
已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?
迁移数据时会有导致时间类型数据时区错误的可能吗?
看完这篇文章,你能解决上面所有的疑惑。首先出场的是和时区相关的启动参数和系统变量。
如果要在 MySQL 启动时就指定时区,则应该使用启动参数: default-time-zone ,示例:
启动后我们可以看到控制时区的系统变量,其中 time_zone 变量控制时区,在MySQL运行时可以通过 set 命令修改(注意:不可以写在 mycnf 中):
启动参数和系统变量的可用值遵循相同的格式:
system_time_zone 变量只有全局值没有会话值,不能动态修改,MySQL 启动时,将尝试自动确定服务器的时区,并使用它来设置 system_time_zone 系统变量, 此后该值不变。当 time_zone='system' 时,就是使用的这个时区,示例中 time_zone 就是 CST,而 CST 在 RedHat 上就是东八区:
概括一下就两点:
1 NOW() 和 CURTIME() 系统函数的返回值受当前 session 的时区影响
不仅是select now(),包括insert values(now())、以及字段的 DEFAULT CURRENT_TIMESTAMP 属性也受此影响:
2 timestamp 数据类型字段存储的数据受时区影响
timestamp 数据类型会存储当时session的时区信息,读取时会根据当前 session 的时区进行转换;而 datetime 数据类型插入的是什么值,再读取就是什么值,不受时区影响。也可以理解为已经存储的数据是不会变的,只是 timestamp 类型数据在读取时会根据时区转换:
关于时区所有明面上的东西都在上面了,我们前面提到的困扰就是在暗处的经验。
1 MySQL的安装规范中应该设置什么时区?
对于国内的业务了,在 mycnf 写入 default-time-zone='+08:00' `,其他地区和开发确认取对应时区即可。
为什么不设置为 system 呢?使用系统时间看起来也是个不错的选择,比较省事。不建议的原因有两点:
2 JAVA应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?
这通常是 JDBC 参数中没有为连接设置时区属性(用 serverTimezone 参数指定),并且MySQL中没有设置全局时区,这样MySQL默认使用的是系统时区,即 CST。这样一来应用与MySQL 建立的连接的 session time_zone 为 CST ,前面我们提到 CST 在 RedHat 上是 +08:00 时区,但其实它一共能代表4个时区:
JDBC在解析CST时使用了美国标准时间,这就会导致时区错误。要解决也简单:一是遵守上面刚说到的规范,对MySQL显示的设置'+08:00'时区;二是JDBC设置正确的 serverTimezone。
3 已经运行一段时间的业务,修改MySQL的时区会影响已经存储的时间类型数据吗?
完全不会,只会影响对 timestamp 数据类型的读取。这里不得不提一句,为啥要用 timestamp?用 datetime 不香吗,范围更大,存储空间其实差别很小,赶紧加到开发规范中吧。
4 迁移数据时会有导致时间类型数据时区错误的可能吗?
这个还真有,还是针对 timestamp 数据类型,比如使用 mysqldump 导出 csv 格式的数据,默认这种导出方式会使用 UTC 时区读取 timestamp 类型数据,这意味导入时必须手工设置 sessiontime_zone='+00:00'才能保证时间准确:
如何避免?mysqldump 也提供了一个参数 --skip-tz-utc ,意思就是导出数据的那个连接不设置 UTC 时区,使用 MySQL 的 gloobal time_zone 系统变量值。
其实 mysqldump 导出 sql 文件时默认也是使用 UTC 时区,并且会在导出的 sql 文件头部带有 session time_zone 信息,这样可以保证导 SQL 文件导入和导出时使用相同的时区,从而保证数据的时区正确(而导出的 csv 文件显然不可以携带此信息)。需要注意的是 --compact 参数会去掉 sql 文件的所有头信息,所以一定要记得: --compact 参数得和 --skip-tz-utc 一起使用。
; UTC时间与北京时间的换算
我们知道,世界的每个地区都有自己的本地时间,整个地球共分为二十四时区,也就是说,每个时区都有自己的本地时间。
在互联网通信中,统一使用一个标准时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。
如何进行UTC时间与北京时间的换算呢北京市区是东八区,领先UTC 8个小时,例如:Sun, 19 July 2020 09:45:10 +0800,说明时间是2020年7月19号,星期日,上午9点45分10秒,该地区本地时领先UTC差 8个小时(+0800,就是东八区时间)。如果要把这个时间转化为UTC,可以使用以下公式:
UTC + 时区差 = 本地时间
时区差东为正,西为负。为此,把东八区时区差记为:+0800,
UTC + (+0800) = 北京时间
那么,
UTC = 北京时间 - 0800,即:0945 - 0800 = 0145
即UTC是当天凌晨1点45分10秒。若结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,北京时间是 0225 (凌晨2点25分),那么,UTC就是 0225 _ 0800 = -0375,负号意味着是前一天, -0375 + 2400 = 2025,既前一天的晚上8点25分。
以上就是关于我想javascript写一个函数返回现在时间到当天8:30地时间差,返回的是秒数,不知道怎么写全部的内容,包括:我想javascript写一个函数返回现在时间到当天8:30地时间差,返回的是秒数,不知道怎么写、java获取凌晨时间戳为什么要减去时区偏移量、技术分享 | MySQL:一文弄懂时区&time_zone等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)