HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ InstallDate и systeminfo.exe выдает неправильную дату .
Определение метки времени UNIX не зависит от часового пояса. Отметка времени UNIX определяется как количество секунд, прошедших с 00:00:00 по всемирному координированному времени (UTC), четверг, 1 января 1970 года, без учета високосных секунд.
Другими словами, если вы установили свой компьютер в Сиэтле, штат Вашингтон, и переехали в Нью-Йорк, штат Нью-Йорк, HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ InstallDate не будет отражать это. Это неправильная дата , она не хранит часовой пояс, в котором был изначально установлен компьютер.
В результате, , если вы измените часовой пояс во время работы этой программы, дата будет неправильной. Вы должны повторно запустить исполняемый файл, чтобы он учитывал изменение часового пояса.
Но вы можете получить информацию о часовом поясе от WMI Win32_Registry class.
InstallDate в формате UTC (ггггммддЧЧММСС.хххххх ± UUU) согласно Microsoft TechNet статья «Работа с датами и временем с использованием WMI», где, в частности, xxxxxx - это миллисекунды, а ± UUU - количество минут, отличное от Время по Гринвичу.
private static string RegistryInstallDate()
{
DateTime InstallDate = new DateTime(1970, 1, 1, 0, 0, 0); //NOT a unix timestamp 99% of online solutions incorrect identify this as!!!!
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Registry");
foreach (ManagementObject wmi_Windows in searcher.Get())
{
try
{
///CultureInfo ci = CultureInfo.InvariantCulture;
string installdate = wmi_Windows["InstallDate"].ToString();
//InstallDate is in the UTC format (yyyymmddHHMMSS.xxxxxx±UUU) where critically
//
// xxxxxx is milliseconds and
// ±UUU is number of minutes different from Greenwich Mean Time.
if (installdate.Length==25)
{
string yyyymmddHHMMSS = installdate.Split('.')[0];
string xxxxxxsUUU = installdate.Split('.')[1]; //±=s for sign
int year = int.Parse(yyyymmddHHMMSS.Substring(0, 4));
int month = int.Parse(yyyymmddHHMMSS.Substring(4, 2));
int date = int.Parse(yyyymmddHHMMSS.Substring(4 + 2, 2));
int hour = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2, 2));
int mins = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2 + 2, 2));
int secs = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2 + 2 + 2, 2));
int msecs = int.Parse(xxxxxxsUUU.Substring(0, 6));
double UTCoffsetinMins = double.Parse(xxxxxxsUUU.Substring(6, 4));
TimeSpan UTCoffset = TimeSpan.FromMinutes(UTCoffsetinMins);
InstallDate = new DateTime(year, month, date, hour, mins, secs, msecs) + UTCoffset;
}
break;
}
catch (Exception)
{
InstallDate = DateTime.Now;
}
}
return String.Format("{0:ddd d-MMM-yyyy h:mm:ss tt}", InstallDate);
}