src/Providers/DateTime.ps1

# Providers/DateTime.ps1

$script:_Timezones = @(
    'Africa/Abidjan','Africa/Accra','Africa/Lagos','Africa/Nairobi','America/Anchorage',
    'America/Chicago','America/Denver','America/Los_Angeles','America/New_York',
    'America/Sao_Paulo','America/Toronto','Antarctica/Vostok','Asia/Bangkok',
    'Asia/Dubai','Asia/Hong_Kong','Asia/Jakarta','Asia/Karachi','Asia/Kolkata',
    'Asia/Seoul','Asia/Shanghai','Asia/Singapore','Asia/Tokyo','Atlantic/Bermuda',
    'Australia/Melbourne','Australia/Sydney','Europe/Amsterdam','Europe/Athens',
    'Europe/Berlin','Europe/Brussels','Europe/Budapest','Europe/Copenhagen',
    'Europe/Dublin','Europe/Helsinki','Europe/Lisbon','Europe/London','Europe/Madrid',
    'Europe/Moscow','Europe/Oslo','Europe/Paris','Europe/Rome','Europe/Stockholm',
    'Europe/Vienna','Europe/Warsaw','Europe/Zurich','Pacific/Auckland',
    'Pacific/Honolulu','Pacific/Sydney','UTC'
)

$script:_MonthNames = @('January','February','March','April','May','June',
    'July','August','September','October','November','December')
$script:_DayNames   = @('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday')
$script:_Centuries  = @('I','II','III','IV','V','VI','VII','VIII','IX','X',
    'XI','XII','XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX','XXI')

function _RandDate([datetime]$Min,[datetime]$Max) {
    $span = $Max - $Min
    $secs = [long]($span.TotalSeconds * ((_Rng).NextDouble()))
    return $Min.AddSeconds($secs)
}

function Get-FakeUnixTime {
<#.SYNOPSIS Unix timestamp up to $Max (default now).#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    $epoch = [datetime]::new(1970,1,1,0,0,0,[System.DateTimeKind]::Utc)
    $d = _RandDate $epoch $Max
    return [long]($d - $epoch).TotalSeconds
}

function Get-FakeDateTime {
<#.SYNOPSIS DateTime object up to $Max.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return _RandDate ([datetime]::new(1970,1,1)) $Max
}

function Get-FakeDateTimeAD {
<#.SYNOPSIS DateTime from year 1 AD up to $Max.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return _RandDate ([datetime]::new(1,1,1)) $Max
}

function Get-FakeISO8601 {
<#.SYNOPSIS ISO 8601 string up to $Max.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('yyyy-MM-ddTHH:mm:sszzz')
}

function Get-FakeDate {
<#.SYNOPSIS Formatted date string.#>
    [CmdletBinding()]
    param(
        [Parameter()] [string]   $Format = 'yyyy-MM-dd',
        [Parameter()] [datetime] $Max    = [datetime]::Now
    )
    return (Get-FakeDateTime -Max $Max).ToString($Format)
}

function Get-FakeTime {
<#.SYNOPSIS Formatted time string.#>
    [CmdletBinding()]
    param(
        [Parameter()] [string]   $Format = 'HH:mm:ss',
        [Parameter()] [datetime] $Max    = [datetime]::Now
    )
    return (Get-FakeDateTime -Max $Max).ToString($Format)
}

function Get-FakeDateTimeBetween {
<#.SYNOPSIS DateTime between $StartDate and $EndDate.#>
    [CmdletBinding()]
    param(
        [Parameter()] [datetime] $StartDate = ([datetime]::Now.AddYears(-30)),
        [Parameter()] [datetime] $EndDate   = [datetime]::Now
    )
    return _RandDate $StartDate $EndDate
}

function Get-FakeDateTimeThisCentury {
<#.SYNOPSIS DateTime this century (since 2000).#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return _RandDate ([datetime]::new(2000,1,1)) $Max
}

function Get-FakeDateTimeThisDecade {
<#.SYNOPSIS DateTime this decade.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    $decade = [datetime]::new(([datetime]::Now.Year / 10 * 10),1,1)
    return _RandDate $decade $Max
}

function Get-FakeDateTimeThisYear {
<#.SYNOPSIS DateTime this year.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return _RandDate ([datetime]::new([datetime]::Now.Year,1,1)) $Max
}

function Get-FakeDateTimeThisMonth {
<#.SYNOPSIS DateTime this month.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    $d = [datetime]::Now
    return _RandDate ([datetime]::new($d.Year,$d.Month,1)) $Max
}

function Get-FakeAmPm {
<#.SYNOPSIS 'am' or 'pm'.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('tt').ToLower()
}

function Get-FakeDayOfMonth {
<#.SYNOPSIS Day of month as zero-padded string.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('dd')
}

function Get-FakeDayOfWeek {
<#.SYNOPSIS Day of week name.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).DayOfWeek.ToString()
}

function Get-FakeMonth {
<#.SYNOPSIS Month number as zero-padded string.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('MM')
}

function Get-FakeMonthName {
<#.SYNOPSIS Month name.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('MMMM')
}

function Get-FakeYear {
<#.SYNOPSIS Year as 4-digit string.#>
    [CmdletBinding()]
    param([Parameter()] [datetime] $Max = [datetime]::Now)
    return (Get-FakeDateTime -Max $Max).ToString('yyyy')
}

function Get-FakeCentury {
<#.SYNOPSIS Roman numeral century.#>
    [CmdletBinding()] param()
    return Get-FakeRandomElement $script:_Centuries
}

function Get-FakeTimezone {
<#.SYNOPSIS Timezone string.#>
    [CmdletBinding()] param()
    return Get-FakeRandomElement $script:_Timezones
}