项目中的时间转化实战

488 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

额,今天又是被自己打脸的一天, 痛苦的bug找我来了,刚改完新的功能,小的问题就出现了。额

还能怎么办,只能默默扛下了所以,还好我的老大是个严慈的人,额;

今天的是关于被时间搞得一天。

背景: 项目中会遇到很多的时间,各种格式,各种种类,但是基本都是时间戳位基础的,泛华出多种的时间日期格式,有的时间对不上,可能是时区不一样,有的用是国际时间(UTC)

UTC

协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。

北京时间:

GM+8

时区+8,是根据地理位置划分的;

一般的国际时间,是比北京早8个小时,所以很多国际系统的时间都是采用的UTC的格林尼治时间计算的,

在UTC的基础上在有特定的格式,我们会很难分辨出时间的格式差距;

比如说显示是:北京时间

image.png

GMT: 就是当前

image.png

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()

可以直接输出当前的时间戳信息