我有一个 Active Directory 服务器和一个 Apache Web 服务器。 两台服务器都有正确的日期和时间。
我使用 PHP 脚本来显示用户的上次登录和上次密码重置。这很好用,但是两个值都显示过去两个小时的时间。我直接在 Active Directory 服务器上重置密码,而不是通过脚本。
我知道,值“lastlogontimestamp”只有在大于 14 天时才会刷新。因此,为了测试这个值,我创建了新用户
我不知道问题是什么以及我能做些什么来以干净的方式解决这个问题。当然,我可以手动添加两个小时,但我认为,这是一种“干净的方式”。
这是我获取上次登录的代码:
$lastLogonTimestamp = isset($userEntry['lastlogontimestamp']) ? $userEntry['lastlogontimestamp'][0] : 0;
$lastLogon = $lastLogonTimestamp != 0 ? date("Y-m-d H:i:s", intval($lastLogonTimestamp / 10000000 - 11644473600)) : 'N/A';
这是我的代码,用于重置最后一次密码:
$pwdLastSetTimestamp = isset($userEntry['pwdlastset'][0]) ? $userEntry['pwdlastset'][0] : 0;
if ($pwdLastSetTimestamp != 0) {
$unixTimestamp = (int)($pwdLastSetTimestamp / 10000000 - 11644473600);
$dateTime = DateTime::createFromFormat('U', (string)$unixTimestamp);
if ($dateTime instanceof DateTime && $dateTime->format('U') === (string)$unixTimestamp) {
$tag = $dateTime->format('d');
$monatIndex = (int)$dateTime->format('m') - 1;
$monatsnamen = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
$monat = $monatsnamen[$monatIndex];
$jahr = $dateTime->format('Y');
$uhrzeit = $dateTime->format('H:i');
$passwordLastSet = "$tag. $monat $jahr um $uhrzeit Uhr";
} else {
$passwordLastSet = 'Ungültiges Datum';
}
} else {
$passwordLastSet = 'N/A';
}
始终将时间戳/日期时间存储在 UTC 中是一个很好的做法。你只需要正确地表示/显示它们,即根据用户本地的时区,例如:
$timezone = new DateTimeZone('Europe/Berlin');
$dateTime = DateTime::createFromFormat('U', (string)$unixTimestamp, $timezone);
显然,如果您的用户来自不同地区,则不建议像上面的代码片段那样对时区进行硬编码,因此下一步是从浏览器获取用户时区并使用 cookie 或会话将它们传递到服务器,以便您的脚本可以使用正确的时区。
两台服务器都有正确的日期和时间。
好吧,要么它是正确的(数据库中的 UTC 时间戳,代表具有正确的时区),要么不完全是因为存储的是本地时间戳而不是 UTC 时间戳。在后一种情况下,您需要在数据库中重置它们。