Примечание. Этот вопрос является почти дубликатом Изменить формат даты с "ггггммдд" на "мм / дд / гггг" ; в то время как оба тесно связаны, этот вопрос более явно сосредоточен на обоих разборе от строки до даты и затем до строки, используя другую формат; напротив, связанный вопрос имеет аспект из , который рассматривается как второстепенная часть вопроса.
Бали C в Прокомментируйте вопрос, придумав самое лаконичное решение, для которого требуется лишь небольшая настройка:
# Note the "\"-escaped separators - see below.
PS> Get-Date -Date 2021-12-23 -Format dd\-MM\-yyyy # or dd\/MM\/yyyy
23-12-2021
Это будет работать с большинством действующих культур, потому что формат yyyy-MM-dd
( как показано в примере входной строки, '2021-12-23'
) является общепризнанным форматом во всех, кроме нескольких культур.
PowerShell обычно пытается использовать инвариант culture , чтобы код работал одинаково в разных культурах, но в случае аргументов командлета на самом деле является чувствительным к культуре, что является исторической случайностью, которая не может быть исправлено без нарушения обратной совместимости .
См. ниже по-настоящему инвариантное решение, которое также объясняет, почему символы-разделители. -
и /
должны быть экранированными для максимальной надежности.
Поскольку В приведениях PowerShell используется инвариант культура и формат yyyy-MM-dd
(как показано в примере строки ввода, '2021-12-23'
) оказывается признанным форматом в этой культуре , вы можете просто:
- приведите вашу строку к
[datetime]
, чтобы создать System.DateTime
экземпляр - и , затем вызовите
.ToString()
с желаемый формат строки для получения желаемого формата строки, как показано во многих ответах на этот вопрос .
Следующее должно работать независимо от конкретной культуры c в действительности:
PS> ([datetime] '2021-12-23').ToString('MM\-dd\-yyyy')
12-23-2021
PS> ([datetime] '2021-12-23').ToString('MM"/"dd"/"yyyy')
12/23/2021
Обратите внимание, что символ разделителя. -
и /
экранированы / указаны , чтобы указать, что они будут использоваться дословно (вы можете выбирать между \
-экранирование и встроенное цитирование).
Это необходимо, поскольку такие символы, как /
, по умолчанию интерпретируются как заполнители для соответствующей культуре даты разделитель, например, поэтому - в зависимости от действующей культуры (как отражено в $PSCulture
) - они могут быть переведены в другой символ, такой как, например, .
.
Если ваше исходное строковое представление было не распознаваемым в инвариантной культуре, вы можете использовать System.DateTime.ParseExact
, чтобы проанализировать вашу входную строку в [datetime]
(System.DateTime
) экземпляр перед вызовом .ToString()
, как описано выше:
[datetime]::ParseExact(
'2021-12-23',
'yyyy\-MM\-dd',
$null # current culture
).ToString('MM"-"dd"-"yyyy')
Выше приведено снова '12-23-2021'
.
Обратите внимание, что из-за использования $null
для анализа используется культура current , которая в данном случае, однако, не действует что разделитель символов. используйте встроенные кавычки, и, учитывая, что задействованы только цифры , а не (зависит от культуры) имена , например, названия месяцев.
Если вам нужно контекст специфицирует c культура , передавая экземпляр [cultureinfo]
(System.Globalization.CultureInfo
) вместо $null
; например, для анализа в контексте французской (французской) культуры, передайте [cultureinfo] 'fr-FR'
.