Public/ConvertTo-ALHDateTime.ps1
<#PSScriptInfo
.VERSION 1.2.0 .GUID 044cd38b-8558-4820-b412-c56121c12018 .AUTHOR Dieter Koch .COMPANYNAME .COPYRIGHT (c) 2021-2023 Dieter Koch .TAGS .LICENSEURI https://github.com/admins-little-helper/ALH/blob/main/LICENSE .PROJECTURI https://github.com/admins-little-helper/ALH .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES 1.0.0 Initial release 1.1.0 Added parameter 'AsLocalTime' 1.2.0 Added pipeline support. Set defaut value to current date/time for parameter 'DateTime' #> <# .DESCRIPTION Contains a function to convert miliseconds since 1970 or 1601 or ticks since 1601 to a DateTime value. #> function ConvertTo-ALHDateTime { <# .SYNOPSIS Converts miliseconds since 1970 or 1601 or ticks since 1601 to a DateTime value. .DESCRIPTION Converts miliseconds since 1970 or 1601 or ticks since 1601 to a DateTime value (by defaults in UTC time). The function returns $null .PARAMETER DateTimeValue Miliseconds since 01.01.1700 00:00:00 or miliseconds since 01.01.1601 00:00:00 or ADDateTime value. .PARAMETER AsLocalTime If specified, the resulting DateTime value will be interpreted in local time zone, instead of UTC. .EXAMPLE ConvertTo-ALHDateTime -DateTimeValue 13270022798437 DateTimeBase1970 DateTimeBase1601 DateTimeBaseAD ---------------- ---------------- -------------- 06.07.2390 03:26:38 06.07.2021 03:26:38 16.01.1601 08:36:42 Convert a int64 value representing an miliseconds since 01.01.1601 to date/time in UTC format. .EXAMPLE ConvertTo-ALHDateTime -DateTimeValue 13270022798437 DateTimeBase1970 DateTimeBase1601 DateTimeBaseAD ---------------- ---------------- -------------- 06.07.2390 03:26:38 06.07.2021 03:26:38 16.01.1601 08:36:42 Convert a int64 value representing an miliseconds since 01.01.1601 to date/time in UTC format. .EXAMPLE (Get-ADUser -Filter * -Property lastLogonTimeStamp).lastLogonTimeStamp | ConvertTo-ALHDateTime DateTimeBase1970 DateTimeBase1601 DateTimeBaseAD ---------------- ---------------- -------------- 04.11.2022 09:43:10 04.11.2022 09:43:10 23.02.2020 17:59:40 23.02.2020 17:59:40 23.11.2015 05:57:05 09.11.2022 11:14:48 This example shows how to retrieve the lastLogonTimeStamp for all users in Active Directory and get the DateTime value of for it. .INPUTS System.Int64 .OUTPUTS PSCustomObject .NOTES Author: Dieter Koch Email: diko@admins-little-helper.de .LINK https://github.com/admins-little-helper/ALH/blob/main/Help/ConvertTo-ALHDateTime.txt #> [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [double[]][AllowNull()] $DateTimeValue, [switch] $AsLocalTime ) begin { $DT1970 = Get-Date -Date "1970-01-01T00:00:00" $DT1601 = Get-Date -Date "1601-01-01T00:00:00" $DateTimeConverted = [PSCustomObject]@{ DateTimeBase1970 = $DT1970.AddMilliseconds($DateTimeValueElement) DateTimeBase1601 = $DT1601.AddMilliseconds($DateTimeValueElement) DateTimeBaseAD = [DateTime]::FromFileTime($DateTimeValueElement) } } process { if ($null -eq $DateTimeValue) { # return a PSCustomObject with $null values for each property $DateTimeConverted } else { foreach ($DateTimeValueElement in $DateTimeValue) { try { if (($DateTimeValueElement * 10000) -lt [DateTime]::MaxValue.Ticks) { [datetime]$LocalDTBase1970 = $DT1970.AddMilliseconds($DateTimeValueElement) [datetime]$LocalDTBase1601 = $DT1601.AddMilliseconds($DateTimeValueElement) } } catch { $_ } try { [datetime]$LocalDTBaseAD = [DateTime]::FromFileTime($DateTimeValueElement) } catch { $_ } if ($AsLocalTime.IsPresent) { $DateTimeConverted.DateTimeBase1970 = $( if ($null -ne $LocalDTBase1970) { $LocalDTBase1970 } ) $DateTimeConverted.DateTimeBase1601 = $( if ($null -ne $LocalDTBase1601) { $LocalDTBase1601 } ) $DateTimeConverted.DateTimeBaseAD = $( if ($null -ne $LocalDTBaseAD) { $LocalDTBaseAD } ) } else { $DateTimeConverted.DateTimeBase1970 = $( if ($null -ne $LocalDTBase1970) { $LocalDTBase1970.ToUniversalTime() } ) $DateTimeConverted.DateTimeBase1601 = $( if ($null -ne $LocalDTBase1601) { $LocalDTBase1601.ToUniversalTime() } ) $DateTimeConverted.DateTimeBaseAD = $( if ($null -ne $LocalDTBaseAD) { $LocalDTBaseAD.ToUniversalTime() } ) } $DateTimeConverted } } } } #region EndOfScript <# ################################################################################ ################################################################################ # # ______ _ __ _____ _ _ # | ____| | | / _| / ____| (_) | | # | |__ _ __ __| | ___ | |_ | (___ ___ _ __ _ _ __ | |_ # | __| | '_ \ / _` | / _ \| _| \___ \ / __| '__| | '_ \| __| # | |____| | | | (_| | | (_) | | ____) | (__| | | | |_) | |_ # |______|_| |_|\__,_| \___/|_| |_____/ \___|_| |_| .__/ \__| # | | # |_| ################################################################################ ################################################################################ # created with help of http://patorjk.com/software/taag/ #> #endregion |