1hutool源码分析:DateUtil(时间工具类)-当前时间和当前时间戳_hutool 日期转10位时间戳

	return toString(DatePattern.NORM_DATETIME_FORMAT);
}

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


![image-20210706210932679](https://img-blog.csdnimg.cn/img_convert/bbf6c74379abe2cc303ada4b9579fe2e.png)


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


![image-20210706213821993](https://img-blog.csdnimg.cn/img_convert/dbf59f8db7fd48575e1a734f67985a89.png)


#### 传统写法一


获取当前时间



	//获取当前时间
	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;方法返回此主机(程序运行的主机)的默认时区


#### 使用默认时区是否有风险?


我们来看下默认时区是怎么取值的


![image-202107085554049](https://img-blog.csdnimg.cn/img_convert/46ad93a043944770f22032c11fd7aa56.png)


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方法


![image-20210706233905997](https://img-blog.csdnimg.cn/img_convert/dd40696814c634cbf4d9c8d76fe9e509.png)


![image-20210706234052425](https://img-blog.csdnimg.cn/img_convert/192a5875393e28b15a078779115fc94c.png)



/*
* 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值