internal/functions/generators/New-SldgDate.ps1
|
function New-SldgDate { <# .SYNOPSIS Generates realistic dates based on semantic type. #> [CmdletBinding()] param ( [ValidateSet('BirthDate', 'PastDate', 'FutureDate', 'Timestamp', 'Date', 'DateTime', 'Time', 'RecentDate')] [string]$Type = 'Date', [datetime]$MinDate, [datetime]$MaxDate, [switch]$IncludeTime, [int]$Count = 1 ) $now = Get-Date for ($i = 0; $i -lt $Count; $i++) { $result = switch ($Type) { 'BirthDate' { $min = if ($MinDate) { $MinDate } else { $now.AddYears(-80) } $max = if ($MaxDate) { $MaxDate } else { $now.AddYears(-18) } $range = ($max - $min).TotalDays $min.AddDays((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } 'PastDate' { $min = if ($MinDate) { $MinDate } else { $now.AddYears(-5) } $max = if ($MaxDate) { $MaxDate } else { $now } $range = ($max - $min).TotalDays $min.AddDays((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } 'FutureDate' { $min = if ($MinDate) { $MinDate } else { $now } $max = if ($MaxDate) { $MaxDate } else { $now.AddYears(3) } $range = ($max - $min).TotalDays $min.AddDays((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } 'Timestamp' { $min = if ($MinDate) { $MinDate } else { $now.AddYears(-2) } $max = if ($MaxDate) { $MaxDate } else { $now } $range = ($max - $min).TotalSeconds $min.AddSeconds((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } 'RecentDate' { $min = if ($MinDate) { $MinDate } else { $now.AddDays(-30) } $max = if ($MaxDate) { $MaxDate } else { $now } $range = ($max - $min).TotalDays $min.AddDays((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } 'Time' { $hours = Get-Random -Minimum 0 -Maximum 24 $minutes = Get-Random -Minimum 0 -Maximum 60 $seconds = Get-Random -Minimum 0 -Maximum 60 [timespan]::new($hours, $minutes, $seconds) } default { # Generic date $min = if ($MinDate) { $MinDate } else { $now.AddYears(-3) } $max = if ($MaxDate) { $MaxDate } else { $now.AddYears(1) } $range = ($max - $min).TotalDays $min.AddDays((Get-Random -Minimum 0 -Maximum ([int][Math]::Max(1, $range)))) } } if ($result -is [datetime] -and -not $IncludeTime -and $Type -notin @('Timestamp', 'DateTime', 'Time')) { $result.Date.ToString('yyyy-MM-dd') } elseif ($result -is [datetime]) { $result.ToString('yyyy-MM-ddTHH:mm:ss') } else { $result } } } |