【LDAP】accountExpires属性更新--NT时间戳

前言:刚开始整理MS AD域属性时,对accountExpires这些字段大整数让人觉得很奇怪,明明名称显示应该该属性是一个时间相关类型,数值看起来又不像-_-着手对此字段实现更新功能时,尝试写入标准时间类型和字符串类型,都会报出异常。

查阅了相关资料发现,AD中时间属性有两种类型。

一、通用标准类型-Generalized Time/Universal time 类型

这种以whenCreated、whenChanged属性为代表,这种属性的类型是真正的时间类型。

格式的核心是由ISO8601定义的,W3上的 Date and Time Formats一文介绍得比较易读。不过实际使用的格式不包括横线、冒号等分隔符,具体格式是由ITUX680规定的(在64~65页)。

概括起来,这种格式就是年月日时分秒连续地写在一起,加上一个小数点后的秒值(一般为0),再加上时区,小数点和时区都不可省略。
对于UTC时间,它就形如:20090502173227.0Z 
对于本地时间,它就形如:20090503013227.0+0800 (这两个时间是同一个)

一般来说,向AD中写入时,可以用本地的表示也可以用UTC的表示,但是读出来的时候,都是UTC表示(也就是以Z结尾的)

 

二、NT时间戳型

以lastLogon、pwdLastSet、accountExpires等属性为代表,这类属性的类型(syntax)其实就是一个大整数。NT时间戳与Unix时间戳的思想是一样的,只是前者的定义更bt一些:从1601年1月1日0时起经过的1E-7秒(即100纳秒)的个数(时间是GMT的)。

 

===========================================================================================

Java Date类型转NT时间戳代码:

	/**
	 * 
	* @Title: getNTLongTimestamp
	* @Description: 根据传入Date类型时间,计算NT类型时间戳
	* @param @param date
	* @param @return    设定文件
	* @return long    返回类型
	* @throws
	 */
	public static long getNTLongTimestamp(Date date) {
		long timestamp = date.getTime();
		timestamp -= 57599875L;
		timestamp *= 10000;
		timestamp += 116445312000000000L;
		return timestamp;
	}

代码计算出的数值,在在线工具验证会有小时方面的误差,但是日期无误,后期需要再调整细节(已解决,代码片段已更新!)

链接:NT时间戳转换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值