Powershell Чистый способ преобразования строки в формат mmddyyyy - PullRequest
1 голос
/ 22 января 2020

Заранее спасибо ...

У меня есть строковый вывод:

2021-12-23

строка Base.Type - System.Object

Я хочу преобразовать это:

12-23-2021  

или

12/23/2021

есть идеи?

1 Ответ

0 голосов
/ 22 января 2020

Примечание. Этот вопрос является почти дубликатом Изменить формат даты с "ггггммдд" на "мм ​​/ дд / гггг" ; в то время как оба тесно связаны, этот вопрос более явно сосредоточен на обоих разборе от строки до даты и затем до строки, используя другую формат; напротив, связанный вопрос имеет аспект из , который рассматривается как второстепенная часть вопроса.


Бали 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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...