Java中处理NT时间戳与.net18位时间戳

Window NT时间

Windows NT时间表示从1602年1月1日UTC时间开始的100纳秒数。例如:

131974608035554296

.net18位时间戳

从0001年1月1日开始的100纳秒数。例如:

635210495600000000

转换与测试代码如下:

package com.timestamp.test;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

@Slf4j
public class Test {

    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final long TICKS_AT_EPOCH_NT = 116444736000000000L;

    private static final long TICKS_PER_MILLISECOND = 10000;

    private static TimeZone TIME_ZONE = TimeZone.getDefault();

    private static final long TICKS_AT_EPOCH = 621355968000000000L;

    /**
     * NT时间戳转换
     * @param str NT时间戳
     * @return String 1.空返回null,2."0"返回"0",3.返回yyyy-MM-dd HH:mm:ss格式字符串
     */
    public static String fromNTTimeToJdate(String str) {
        String zero = "0";
        if (StrUtil.isEmpty(str)) {
            return null;
        } else if (zero.equals(str)) {
            return zero;
        } else {
            Calendar calendar = Calendar.getInstance(TIME_ZONE);
            calendar.setTimeInMillis((Long.parseLong(str) - TICKS_AT_EPOCH_NT) / TICKS_PER_MILLISECOND);
            calendar.setTimeInMillis(calendar.getTimeInMillis() - calendar.getTimeZone().getRawOffset());
            return (new SimpleDateFormat(DATE_FORMAT)).format(calendar.getTime());
        }
    }

    /**
     * .net18位时间戳转换
     * @param str .net18位时间戳
     * @return String 1.空返回null,2."0"返回"0",3.返回yyyy-MM-dd HH:mm:ss格式字符串
     */
    public static String fromDnetToJdate(String str) {
        String zero = "0";
        if (StrUtil.isEmpty(str)) {
            return null;
        } else if (zero.equals(str)) {
            return zero;
        } else {
            Calendar calendar = Calendar.getInstance(TIME_ZONE);
            calendar.setTimeInMillis((Long.parseLong(str)-TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND);
            calendar.setTimeInMillis(calendar.getTimeInMillis()-calendar.getTimeZone().getRawOffset());
            return (new SimpleDateFormat(DATE_FORMAT)).format(calendar.getTime());
        }
    }

    public static void main(String[] args) {
        String ntStr = "131974608035554296";
        log.info("NT时间戳:" + fromNTTimeToJdate(ntStr));
        String dntStr = "635210495600000000";
        log.info(".net18位时间戳转换:" + fromDnetToJdate(dntStr));
    }

}

一个从装环境开始的学习记录公众号,欢迎大家关注:

你可能感兴趣的:(java,timestamp)