# encoding: ascii
# api: powershell
# title: FormatDate
# description: Get input date string or get T-n or T+n dates in the specified format.
# version: 0.1
# type: function
# author: Ferenc Toth
# license: CC0
# x-poshcode-id: 5129
# x-archived: 2014-05-02T00:17:36
# x-published: 2014-04-30T11:01:00
#
#
Function FormatDate {
<#
.SYNOPSIS
Get input date string or get T-n or T+n dates in the specified format.
.DESCRIPTION
Author: Ferenc Toth
Date:	20/03/2014
.INPUTS
.PARAMETER Date
Date string in format YYYY/MM/DD or MM/DD/YYYY - Default is today
.PARAMETER Format
Output date format - Default is yyyMMdd

More info about date format in Powershell: http://technet.microsoft.com/en-us/library/ee692801.aspx
.PARAMETER Offset
Offset (+/-) days
.PARAMETER AllDays
Do not skip weekends. By default you have business days (Mon-Fri) only.
.LINK

.EXAMPLE
C:\PS>FormatDate
Returns with today's date in YYYYMMDD format
.EXAMPLE
C:\PS>FormatDate -Offset 1
Returns with T+1 date in YYYYMMDD format
.EXAMPLE
C:\PS>FormatDate -Offset -2
Returns with T-2 date in YYYYMMDD format
.EXAMPLE
C:\PS>FormatDate -Date "2014/03/02" -Format ddMMyy
Returns with 020314

More info about date format in Powershell: http://technet.microsoft.com/en-us/library/ee692801.aspx
#>

    [CmdletBinding()]
    [OutputType([Object])]
	# Define and process parameters
    param (
		# Date
        [parameter(Mandatory=$false)]
		[DateTime] $InputDate=(Get-Date),
		# Format
		[parameter(Mandatory=$false)]
		[string] $Format="yyyMMdd",
		# Offset
		[parameter(Mandatory=$false)]
        [int] $Offset=0,
		# Offset
		[parameter()]
        [switch] $AllDays=$False
    )
    
    process {
		if ($Offset -lt 0) {
			$Private:NEWDATE=$(Get-Date -Date $InputDate)
			for($i=$Offset;$i -lt 0;$i++) {
				$NEWDATE=$($NEWDATE).AddDays(-1)
				if(0 -eq $($NEWDATE.DayOfWeek) -and !$AllDays) {
					$NEWDATE=$($NEWDATE).AddDays(-2)
				} elseif(6 -eq $($NEWDATE.DayOfWeek) -and !$AllDays) {
					$NEWDATE=$($NEWDATE).AddDays(-1)
				}
			}
			$($NEWDATE).ToString($Format)
		} elseif ($Offset -gt 0) {
			$Private:NEWDATE=$(Get-Date -Date $InputDate)
			for($i=$Offset;$i -gt 0;$i--) {
				$NEWDATE=$($NEWDATE).AddDays(1)
				if(6 -eq $($NEWDATE.DayOfWeek) -and !$AllDays) {
					$NEWDATE=$($NEWDATE).AddDays(2)
				}
			}
			$($NEWDATE).ToString($Format)
		} else {
			Get-Date -Date $InputDate -Format $Format
		}
	}
}

set-alias fd FormatDate
Export-ModuleMember -alias fd
Export-ModuleMember -function FormatDate
