0%

Java 开发实践中,我们在处理时间、时区上总是搞得很乱。这里总结一下认为比较好的一个最佳实践,欢迎大家提出自己的意见。

Java 中不带时区的类 java.time.LocalDateTime,这个类对应 MySQL 中 datetime 类型。MySQL 中的 datetime 类型也是不带时区概念的。

不带时区概念的意思就是说,当我看到这个值的时候,并不能唯一确定时间,因为没有时区信息。

但 Java 中的类 java.util.Datejava.time.ZonedDateTime 却是带了时区的类,这个值,是能唯一确定时间的。

我们在中国开发应用程序时,最佳解决方案:

  1. Java, MySQL 所在服务器时间设置为东八区时间。

  2. Java, MySQL 默认使用服务器时区。

  3. java connector 6 版本以后,MySQL 连接字符串指定东八区,不指定是默认西五区的美国东部时间。

  4. 前端拿到东八区时间后,根据浏览器时区做相应的调整。前端提交表单时,拿到当地时间后,转换成东八区时间提交。

在类型转换的时候要非常小心,有些是编译时错误,简单些,有些是运行时错误,要特别注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class ConvTest {

public static void main(String[] args) {

// Integer -> String
Integer i1 = 1;
String s1 = String.valueOf(i1);
System.out.println(s1);

// String i1 = (String) i1; 不相容类型, 不能强制转换

// Integer <- String
String s2 = "1";
Integer i2 = Integer.valueOf(s2);
System.out.println(i2);

// Integer i2 = (Integer) s2; 不相容类型, 不能强制转换
int i22 = Integer.parseInt(s2);
System.out.println(i22);

// Integer - Object
Object o3 = 1;
Integer i3 = (Integer) o3; // 如果o3为字符串, 会有运行时异常, 所以建议用下面 instanceof 做类型判断
System.out.println(i3);


// Integer.valueOf(o3) // 不能用 Object 作为参数

// String - Object
Object o6 = "1";
String s6 = (String) o6;
System.out.println(s6);

Object o4 = "1";
if (o4 instanceof Integer) {
System.out.println("Integer");
} else if (o4 instanceof String) {
System.out.println("String");
}

Object o7 = 1;
String s7 = String.valueOf(o7); // 这里却可以用 Object 作为参数
System.out.println(s7);
}
}

下载源码

进入官网下载页面,https://redis.io/download,我们下载 Redis 4。

http://download.redis.io/releases/redis-4.0.14.tar.gz

1
2
3
$ cd /usr/local/redis
$ sudo wget http://download.redis.io/releases/redis-4.0.14.tar.gz
$ sudo tar -zxvf redis-4.0.14.tar.gz

编译安装

1
2
$ cd redis-4.0.14
$ sudo make test

可能会遇到如下错误:

1
2
[exception]: Executing test client: couldn't execute "src/redis-benchmark": no such file or directory.
couldn't execute "src/redis-benchmark": no such file or directory

然后执行:

1
2
3
4
5
6
7
8
$ sudo make distclean
$ sudo make
$ sudo make test

\o/ All tests passed without errors!

Cleanup: may take some time... OK
(base)

这时可执行文件都默认安装到了 /usr/local/redis/redis-4.0.14/src

如果要指定安装位置,我们可以在前面执行这样的命令:

1
2
$ cd src
$ sudo make install PREFIX=/usr/local/redis/redis-4.0.14

这样就会在 /usr/local/redis/redis-4.0.14/bin 生成可执行文件了。

启动redis服务

1
$ sudo bin/redis-server redis.conf

启动客户端:

1
2
3
$ bin/redis-cli
127.0.0.1:6379> ping
PONG

测试成功。

如果要查询 Redis Server 的版本,在客户执行:

1
2
3
4
127.0.0.1:6379> info
# Server
redis_version:4.0.14
...

就可以看到包括版本号的各种信息了。