Skip to content

Instantly share code, notes, and snippets.

@ninmonkey
Created May 31, 2024 02:52
Show Gist options
  • Save ninmonkey/b3f3d509fe8bd413a6d4190cb2649c80 to your computer and use it in GitHub Desktop.
Save ninmonkey/b3f3d509fe8bd413a6d4190cb2649c80 to your computer and use it in GitHub Desktop.
Calc Relative Dates in Pwsh, using file modified dates

Usage:

$minDate = [datetime]'2000-02-05'
$maxDate = [datetime]'2000-06-04'
$p1 = [datetime]'2000-04-04'
$p2 = [datetime]'2000-05-03'

TestDateTransform -Base $MinDate -Inp $P1

$file = gi $PSCommandPath
TestDateTransform -BaseDate '2024-03-02' -InputDate $file.LastWriteTime

Outputs

    Before                 RelativeTotalDays RelativeTotalMonths RelativeTo
    ------                 ----------------- ------------------- ----------
    2024-05-17 11:54:32 AM             76.50                2.55 2024-03-02 12:00:00 AM

# for a file with this date

    $file.LastWriteTime.ToString('o')
    2024-05-17T11:54:32.1282219-05:00


## final output

Before              : 2000-04-04 12:00:00 AM
RelativeTotalDays   : 59
RelativeTotalMonths : 1.96666666666667
RelativeTo          : 2000-02-05 12:00:00 AM
RenderMonth         : 1
RenderDay           : 29
RenderYear          : nyi
NewName             : nyi_1

Before              : 2024-05-17 11:54:32 AM
RelativeTotalDays   : 76.4962051877535
RelativeTotalMonths : 2.54987350625845
RelativeTo          : 2024-03-02 12:00:00 AM
RenderMonth         : 2
RenderDay           : 16
RenderYear          : nyi
NewName             : nyi_2
function CalcRelativeDays {
param(
[datetime]$BaseDate,
[datetime]$InputDate,
# default returns totalDays, this returns the raw [TimeSpan]
[switch]$PassThru
)
if($PassThru){
return ($InputDate - $BaseDate)
}
($InputDate - $BaseDate).TotalDays
}
function TestDateTransform {
param(
[datetime]$BaseDate,
[datetime]$InputDate
)
$rel_asTotalDays = CalcRelativeDays -Base $BaseDate -Inp $InputDate # [int]
$rel_asTotalMonths = ($rel_asTotalDays / 30) # [int] ($rel_asTotalDays / 30)
# render names for filepaths. future: use a format string or zero pad values.
$newMonth_str = [math]::floor( ($rel_asTotalDays / 30) )
$newDay_str = [math]::Round( $rel_asTotalDays % 30 )
$newYear_str = 'nyi'
[pscustomobject]@{
Before = $InputDate
RelativeTotalDays = $rel_asTotalDays
RelativeTotalMonths = $rel_asTotalMonths
RelativeTo = $BaseDate
RenderMonth = $newMonth_str
RenderDay = $newDay_str
RenderYear = $newYear_str
NewName = @(
$newYear_str
$newMonth_str
# $newDay_Str
) -join '_'
}
}
$minDate = [datetime]'2000-02-05'
$maxDate = [datetime]'2000-06-04'
$p1 = [datetime]'2000-04-04'
$p2 = [datetime]'2000-05-03'
TestDateTransform -Base $MinDate -Inp $P1
$file = gi $PSCommandPath
TestDateTransform -BaseDate '2024-03-02' -InputDate $file.LastWriteTime
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment