# encoding: ascii
# api: powershell
# title: ConvertTo-RelativeTime
# description: Converts a pair of DateTime’s or a TimeSpan into a very approximate relative time like “about 4 days ago.”
# version: 1.5
# type: function
# license: CC0
# function: ConvertTo-RelativeTimeString
# x-poshcode-id: 1463
# x-archived: 2009-11-13T08:18:59
#
#
function ConvertTo-RelativeTimeString {
#.Synopsis 
#  Calculates a relative text version of a duration
#.Description
#  Generates a string approximation of a timespan, like "x minutes" or "x days." Note this method does not add "about" to the front, nor "ago" to the end unless you pass them in.
#.Parameter Span
#  A TimeSpan to convert to a string
#.Parameter Before
#  A DateTime representing the start of a timespan.
#.Parameter After
#  A DateTime representing the end of a timespan.
#.Parameter Prefix
#  The prefix string, pass "about" to render: "about 4 minutes"
#.Parameter Postfix
#  The postfix string, like "ago" to render: "about 4 minutes ago"
[CmdletBinding(DefaultParameterSetName="TwoDates")]
PARAM(
   [Parameter(ParameterSetName="TimeSpan",Mandatory=$true)]
   [TimeSpan]$span
,
   [Parameter(ParameterSetName="TwoDates",Mandatory=$true,ValueFromPipeline=$true)]
   [Alias("DateCreated")]
   [DateTime]$before
,
   [Parameter(ParameterSetName="TwoDates", Mandatory=$true, Position=0)]
   [DateTime]$after
,
   [Parameter(Position=1)]
   [String]$prefix = ""
,
   [Parameter(Position=2)]
   [String]$postfix = ""
 
)
PROCESS {
   if($PSCmdlet.ParameterSetName -eq "TwoDates") {
      $span = $after - $before
   }
   
   "$(
   switch($span.TotalSeconds) {
      {$_ -le 1}      { "$prefix a second $postfix "; break }     
      {$_ -le 60}     { "$prefix $($span.Seconds) seconds $postfix "; break }
      {$_ -le 120}    { "$prefix a minute $postfix "; break }
      {$_ -le 2700}   { "$prefix $($span.Minutes) minutes $postfix "; break } # 45 minutes or less
      {$_ -le 5400}   { "$prefix an hour $postfix "; break } # 45 minutes to 1.5 hours 
      {$_ -le 86400}  { "$prefix $($span.Hours) hours $postfix "; break } # less than a day
      {$_ -le 172800} { "$prefix 1 day $postfix "; break } # less than two days
      default         { "$prefix $($span.Days) days $postfix "; break } 
   }
   )".Trim()
}
}
