小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
额,今天又是被自己打脸的一天, 痛苦的bug找我来了,刚改完新的功能,小的问题就出现了。额
还能怎么办,只能默默扛下了所以,还好我的老大是个严慈的人,额;
今天的是关于被时间搞得一天。
背景: 项目中会遇到很多的时间,各种格式,各种种类,但是基本都是时间戳位基础的,泛华出多种的时间日期格式,有的时间对不上,可能是时区不一样,有的用是国际时间(UTC)
UTC
协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
北京时间:
GM+8
时区+8,是根据地理位置划分的;
一般的国际时间,是比北京早8个小时,所以很多国际系统的时间都是采用的UTC的格林尼治时间计算的,
在UTC的基础上在有特定的格式,我们会很难分辨出时间的格式差距;
比如说显示是:北京时间
GMT: 就是当前
1.如何将UTC固定格式的时间,转化成北京时间(时间戳)?
其实要想UTC转成北京时间,本质上是将失去的8个小时加回来,但是要利用时间戳等效加,不然很容易失误
- 现将UTC固定格式时间,转成固定的时间戳--UTC
- 将时间戳GMT+8,加上8小时的时间戳,返回
- 将现有时间戳转化成固定格式输出
日期方法:
public static final String HOUR_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern(HOUR_PATTERN);
/**
* UTC秒数转换成北京时间(相差8个时区)
*/
public static String utcSecondToBJTime(Long utcTime) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(utcTime * 1000L);
calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 8);
return formatter.format(LocalDateTimeUtils.convertDateToLDT(calendar.getTime()));
}
/**
* 固定格式的时间,转成具体的时间戳
*
* @param date_str 时间
* @param format 格式
* @return
*/
public static String dateToTimeStamp(String date_str, String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return String.valueOf(sdf.parse(date_str).getTime() / 1000);
} catch (Exception e) {
log.error("当前时间转换异常", e);
}
return "";
}
/**
* 时间戳展示为具体的日期
*/
public static String getDateToString(Long time) {
if (time.equals(0L)) {
return null;
}
return formatter.format(LocalDateTimeUtils.convertLongToLDT(time));
}
额,搞定,其中要注意,将固定格式转化成的时间戳,可能已经是北京时间,如果不是再去添加;
System.currentTimeMillis()
可以直接输出当前的时间戳信息