goldapad域WindowsNT时间与Unix时间转换的方法

这篇文章主要讲解了“go ldap ad域 Windows NT时间与Unix时间转换的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go ldap ad域 Windows NT时间与Unix时间转换的方法”吧!

创新互联始终坚持【策划先行,效果至上】的经营理念,通过多达10多年累计超上千家客户的网站建设总结了一套系统有效的全网整合营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都纯水机等企业,备受客户夸奖。

AD域来自windows,其设计了Window NT时间(表示从1602年1月1日UTC时间开始的100纳秒数)

因为要将AD域用户的accountExpires账户过期时间进行修改来控制该用户自动过期的机制,所以要将Window NT与Unix时间进行互相转换。

首先,我们在读取并解析用ldap协议查询出来的AD域用户账号过期时间,将Window NT转换为Unix时间;

其次,在创建用户的时候,根据提交的工单信息,需要为新账号指定一个过期时间,将当前Unix时间加上几个月的过期时间,赋值给accountExpires

最后,当有账号已经过期,使用不了的时候,用户会提交账号重新激活工单,自动为该账号续期;【一:账号正常过期,续6个月之类的; 二:重复提交创建账号申请,不处理发企业微信通知告知已经有账号了,告知对方账号创建和最后修改时间,让对方查看企业微信消息/邮件,如果没有找到账号密码消息,请直接提交密码找回工单(将收到账号和新密码)】

golang原生time包的Duration时间段

A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.

仅仅支持最大为290年的时间段,而windows nt时间为1601年开始,到现今是420多年,根本无法适配,在不采用第三方库的情况下该如何处理呢? 犯迷糊了,怎么将unix时间转换为nt时间,则反过来计算只需要计算出正确的unix时间戳然后将时间戳转换为时间类型即可。

// maxDuration Duration = 1<<63 - 1
fmt.Println(time.Duration(1<<63 - 1))
2562047h57m16.854775807s
292.47111872146 年

Window NT 时间转换为 Unix 时间

// Window NT 时间转换为 Unix 时间
func NtToUnix(ntTime int64) (unixTime time.Time) {
	ntTime = (ntTime - 1.1644473600125e+17) / 1e+7
	return time.Unix(int64(ntTime), 0)
}

测试

func TestNtTimeToDatetime(t *testing.T) {
	// 取当前时间转换为nt时间
	timestamp := time.Now().Unix()*1e+7 + 1.1644473600125e+17
	fmt.Println(timestamp)
	// 将nt时间转换为unix时间
	res := NtToUnix(timestamp)
	fmt.Println(res)
}

Unix 时间转换为 Window NT 时间

// Unix 时间转换为 Window NT 时间
func UnixToNt(expireTime time.Time) (ntTimestamp int64) {
	ntTimestamp = expireTime.Unix()*int64(1e+7) + int64(1.1644473600125e+17)
	return
}

测试

func TestUnixTimeToNtTime(t *testing.T) {
	// 当前时间
	unixTime := time.Now()
	// 当前时间往后推迟6个月
	unixTime.AddDate(0, 6, 0)
	res := UnixToNt(unixTime)
	fmt.Println(res)
}

用户过期期限处理

// 用户过期期限处理 月份为-1 则过期时间为永久;否则 当前时间往后推迟expireMouths个月
func expireTime(expireMouths int64) (expireTimestamp int64) {
	expireTimestamp = 9223372036854775807
	if expireMouths != -1 {
		expireTimestamp = util.UnixToNt(time.Now().AddDate(0, int(expireMouths), 0))
	}
	return
}

python中的写法

import datetime
import time

from dateutil.relativedelta import relativedelta


def expire_time(expire_mouths: int) -> int:
    '''用户账号过期逻辑
    '''
    expire_timestamp = 9223372036854775807
    if expire_mouths != -1:
        expire_timestamp = unix_2_nt(
            datetime.datetime.now() + relativedelta(months=expire_mouths))
    return expire_timestamp


def unix_2_nt(expire_time: datetime) -> int:
    '''Unix 时间转换为 Window NT 时间
    '''
    return time.mktime(expire_time.timetuple()) * 1e+7 + 1.1644473600125e+17


def nt_2_unix(nt_time):
    '''winows时间转换为unix时间
    '''
    return datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=nt_time//10)


if __name__ == '__main__':
    print(expire_time(6))
    print(nt_2_unix(1.3281000774125e+17))

感谢各位的阅读,以上就是“go ldap ad域 Windows NT时间与Unix时间转换的方法”的内容了,经过本文的学习后,相信大家对go ldap ad域 Windows NT时间与Unix时间转换的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


分享名称:goldapad域WindowsNT时间与Unix时间转换的方法
文章链接:http://ybzwz.com/article/gdcgso.html