前言

最近公司项目上实现一个新需求,本地已经测通了没问题,放到服务器上就出现毛病了,时间错了。

问题是什么?

需求是让统计24个小时(以当前时间为准向前推24个小时)的数据。SQL语句大概是这样:

SELECT

h.ID,

h.`NAME`,

COALESCE (

FORMAT(SUM(h.`VALUE`) / COUNT(1), 0),

0

) `VALUE`,

h.insert_time,

DATE_SUB(NOW(), INTERVAL 23 HOUR)

FROM

rep_health_data h

WHERE

h.`NAME` = 'PM25'

AND h.insert_time >= DATE_FORMAT(

DATE_SUB(NOW(), INTERVAL 23 HOUR),

'%Y-%m-%d %k'

)

GROUP BY

DATE_FORMAT(

h.insert_time,

'%Y-%m-%d %k'

)

ORDER BY

h.insert_time

预想结果应该为:

但实际SQL结果为:

多出来整整13个小时的数据。

为什么会这样?

一定是时区问题搞的鬼!查看mysql时区

# 查看数据库时区

mysql> show variables like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | EST |

| time_zone | SYSTEM |

+------------------+--------+

2 rows in set (0.00 sec)

查看服务器时间

root@Innodev0:/# date

Fri Mar 10 11:05:07 CST 2017

root@Innodev0:/# date -R

Fri, 10 Mar 2017 11:05:10 +0800

得,mysql默认使用的SYSTEM时区,即EST时区,查询相关资料可知,EST时区要比北京时间(东八区)慢13个小时,在数据库中的表现即为:

mysql> select now();

+---------------------+

| now() |

+---------------------+

| 2017-03-09 21:24:39 |

+---------------------+

1 row in set (0.00 sec)

确实比当前系统的时间慢了整整13个小时。

我应该怎么做?

一:通过sql命令临时修改

# 设置全局时区

mysql> set global time_zone = '+8:00';

Query OK, 0 rows affected (0.00 sec)

# 设置时区为东八区

mysql> set time_zone = '+8:00';

Query OK, 0 rows affected (0.00 sec)

# 刷新权限使设置立即生效

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

在查一次数据库时区

mysql> show variables like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | EST |

| time_zone | +08:00 |

+------------------+--------+

2 rows in set (0.00 sec)

奥利给,东八区,没毛病!

然后执行sql

OK,已恢复正常!

二:修改my.cnf实现永久修改

vi /etc/mysql/my.cnf

然后在mysqld下边的配置中添加一行:

default-time_zone = '+8:00'

然后重启mysql

service mysql restart

三:代码控制:使用TimeZone工具类

关于TimeZone的具体使用方法不在本文范围内,如需了解请自行百度

import java.util.Date;

import java.util.Calendar;

import java.util.TimeZone;

import java.text.DateFormat;

public class TimeTest{

public static void main(String[] args){

Date date = new Date();

System.out.println(date);

System.out.println(System.getProperty("user.timezone"));

System.out.println(System.getProperty("user.country"));

// 获取所有时区,比如Etc/GMT+12, Etc/GMT+11, Pacific/Midway, Pacific/Niue, Pacific/Pago_Pago...

//String[] ids = TimeZone.getAvailableIDs();

//for (String id : ids) {

// System.out.println(id + ", ");

//}

TimeZone tz;

// 默认时区

tz = TimeZone.getDefault();

System.out.println("======default======");

printDate(tz);

// GMT +09

System.out.println("======GMT +09======");

tz = TimeZone.getTimeZone("GMT+09:00");

printDate(tz);

// GMT +04

System.out.println("======GMT +04======");

tz = TimeZone.getTimeZone("GMT+04:00");

printDate(tz);

// Hongkong

System.out.println("======Hongkong======");

tz = TimeZone.getTimeZone("Hongkong");

printDate(tz);

// Japan

System.out.println("======Japan======");

tz = TimeZone.getTimeZone("Japan");

printDate(tz);

}

private static void printDate(TimeZone tz) {

Date date = new Date();

DateFormat df = DateFormat.getInstance();

df.setTimeZone(tz);

String str = df.format(date);

System.out.println(str + " --- " + tz.getID());

}

}

去服务器上测试:

完成!如果觉得我的文章能够帮助到你,请多多关注、多多分享,各位的支持就是我前进的动力。

慕课网,程序员的梦工厂!

我可以对一个人无限的好,前提是值得。 ——慕冬雪

mysql 时区设定_教你如何修改mysql时区的问题相关推荐

  1. linux查看mysql用户权限_教您如何查看MySQL用户权限

    教您如何查看MySQL用户权限 如果需要查看MySQL用户权限,应该如何实现呢?下面就为您介绍查看MySQL用户权限的方法,并对授予MySQL用户权限的语句进行介绍,供您参考. 查看MySQL用户权限 ...

  2. 阿里云服务器mysql默认密码_阿里云服务器修改MySQL初始密码---Linux学习笔记

    主要方法就是修改 MySQL按照文件下面的my.cnf文件 首先是找到my.cnf文件, # find / -name "my.cnf" # cd /etc 接下来最好是先备份my ...

  3. 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法

    多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍 ...

  4. mysql 时区设定_设置MySQL默认时区

    MySQL默认的时区是UTC时区,比北京时间晚8个小时. 假设日志里面的时间是中午12:00,那么北京时间应该是晚上的8:00点钟. 为方便查看和设置时间,我们要设置MySQL的默认时区,以符合本地使 ...

  5. linux mysql jdk路径_教大家在如何Centos7系统中安装JDK、Tomcat、Mysql(文末附马哥linux全套视频教......

    目录1.jdk的安装 2.tomcat的安装 3.mysql的安装 远程工具:SSH Secure File Transfer Client 远程工具的使用 下载地址:https://pan.baid ...

  6. c#获取本地ip地址网关子网掩码_教你如何修改路由器LAN口IP地址的方法

    现在绝大部分品牌或非品牌有线或无线路由器,其LAN口地址一般使用192.168.1.1或192.168.0.1网段,而使用此默认地址,既不安全,有时也不实用,比如局域网中电脑数过高,超过255台,则此 ...

  7. 如何修改vue打包的名字_教你如何修改Mac的电脑名字

    很多工作的小伙伴,在和同事传输东西的时候总是由于使用的人太多,名字太相似对方总是找不到自己怎么办呢?本章小编就来教大家如何修改Mac电脑的名称. 1.首先,我们可以在终端上查看自己Mac的名称. 2. ...

  8. 路由器局域网设置_教你如何修改路由器LAN口IP地址的方法

    现在绝大部分品牌或非品牌有线或无线路由器,其LAN口地址一般使用192.168.1.1或192.168.0.1网段,而使用此默认地址,既不安全,有时也不实用,比如局域网中电脑数过高,超过255台,则此 ...

  9. 命令行怎么修改mysql密码_[转]命令行修改MySQL密码

    通过MySQL命令行,可以修改mysql数据库的密码,下面就为您详细介绍该MySQL命令行,如果您感兴趣的话,不妨一看. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 ...

最新文章

  1. python实现选择排序
  2. com.facebook.imagepipeline.bitmaps.TooManyBitmapsException Fresco使用过程中遇到的坑
  3. 面试 -- Java基础(一)
  4. linux 查看mysql运行时间_linux – strace显示从mysql socket读取很长时间 – mysql需要很长时间才能执行查询?...
  5. VirtualAlloc和VirtualCopy----VirtualFree
  6. 如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题
  7. redis——新版复制
  8. ntp-redhat 同步时间配置
  9. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)
  10. java字符串构造函数的应用_构造函数中的参数0需要找不到类型为'java.lang.String'的bean...
  11. sql经典题目(1)
  12. 【洛谷p1012】拼数
  13. ios 点生成线路 百度地图_iOS百度地图开发之路径规划
  14. mysql 创建事件_MySQL创建事件(CREATE EVENT)
  15. 视频截图获取视频某一帧做图片
  16. 独立思考者的思考模型----智商160以上的人都应该学会的(摘自杜牛牛博客)
  17. apple pay 技术_如何在Apple Watch上设置和使用Apple Pay
  18. B.FRIEND背光防水静音键盘,高剪刀脚键盘GK4
  19. 关于wifi portal认证--为浏览器添加wifi认证功能
  20. 大学计算机专业游戏本推荐,选这几款就对了!大学生笔记本电脑盘点推荐

热门文章

  1. PS中逆光调人像(包含发丝抠图)
  2. android新消息提醒功能,Android仿微信新消息提示音
  3. excel 进行二叉树_EXCEL和炒股-如何从海量的数据中提取有用信息
  4. 3dmip12小时内无法注册_iPhone12如何玩英雄联盟手游?一分钟教你快速注册下载台服lol手游_3DM手游...
  5. 三十六.用牛顿迭代法求输入的数的平方根
  6. 周赛(三)_dp_01背包_1423: 贪婪戈尔曼
  7. 一些正则表达式(js代码验证)
  8. 数字化转型需要什么样的“发动机”?
  9. linux脚本数组元素赋值,shell 数组赋值
  10. go unrecognized relocation (0x2a) in section `.text‘问题