return toString(DatePattern.NORM_DATETIME_FORMAT);
}
DateTime重写了toString() 方法,格式化了时间,返回"yyyy-MM-dd HH:mm:ss" 格式字符串

从\*\*DateTime(long timeMillis, TimeZone timeZone)**中源码中,可看出,在**Date(long date)\*\*基础上,多加了timeZone的赋值。

#### 传统写法一
获取当前时间
//获取当前时间
Date date = new Date();
System.out.println(date.toString());
//格式化时间
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(date));
#### 对比
hutool的写法对比传统写法会更加简洁一些,而且定义了DateTime对象,这个是hutool的DateUtil(时间工具类)的基础。
### 源码分析二
/\*\*
* 当前时间
*/
public DateTime() {
this(TimeZone.getDefault());
}
\*\*TimeZone.getDefault()\*\*是JDK自带的方法,所属包:java.util;方法返回此主机(程序运行的主机)的默认时区
#### 使用默认时区是否有风险?
我们来看下默认时区是怎么取值的

1、java.util.TimeZone类中getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。
2、时间ID zoneID的获取方式:先从JVM中的user.timezone变量中读取,如果读不到,再读取系统的默认时区
**zoneID = getSystemTimeZoneID(javaHome);**
/**
* Gets the platform defined TimeZone ID.
**/
private static native String getSystemTimeZoneID(String javaHome);
看到这个native ,说明已经挖到核心了,到了这一步,还是不清楚是怎么获取系统的默认时区的,那怎么办,JDK代码只能跟到这里。
转战OpenJDK,源码下载方式:https://gitee.com/mirrors/openjdk
3、如果再读不到,就用默认的 **GMT\_ID = "GMT"**
##### 避免风险最佳实践
JVM中的user.timezone变量中设置时区
#### 什么是native
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
##### native的源码怎么看呢
以\*\*private static native String getSystemTimeZoneID(String javaHome)\*\*为例
getSystemTimeZoneID方法所在的package java.util.TimeZone;
如图所示,找到TimeZone.c下的getSystemTimeZoneID方法


/*
* Gets the platform defined TimeZone ID
*/
JNIEXPORT jstring JNICALL
Java_java_util_TimeZone_getSystemTimeZoneID(JNIEnv *env, jclass ign,
jstring java_home, jstring country)
{
const char *cname;
const char *java_home_dir;
char *javaTZ;
if (java_home == NULL)
return NULL;
java_home_dir = JNU\_GetStringPlatformChars(env, java_home, 0);
if (java_home_dir == NULL)
return NULL;
if (country != NULL) {
cname = JNU\_GetStringPlatformChars(env, country, 0);
/\* ignore error cases for cname \*/
} else {
cname = NULL;
}
/\*
* Invoke platform dependent mapping function
*/
javaTZ = findJavaTZ_md(java_home_dir, cname);
free((void \*)java_home_dir);
if (cname != NULL) {
free((void \*)cname);
}
if (javaTZ != NULL) {
jstrin