Культурное форматирование временной переменной - PullRequest
3 голосов
/ 09 июля 2019

В этом примере мне кажется, что первые два вывода должны совпадать, давая мне форматирование, основанное на моей определенной культуре.Последнее должно отличаться, потому что французское форматирование отличается.Вместо этого последние два одинаковы и оба получают какое-то форматирование по умолчанию.Итак, как мне сделать форматирование на основе культуры, когда время является переменной, а не форматировать напрямую с помощью Get-Date?Кажется, что должно быть то же самое, но это не так.

get-date -format ((Get-Culture).DateTimeFormat.FullDateTimePattern)

$time = Get-Date
$pattern = 'FullDateTimePattern'
$formattedTime = $time -f (Get-Culture).DateTimeFormat.$pattern
Write-Host "$formattedTime"

$culture = New-Object system.globalization.cultureinfo('fr-FR') 
$formattedTime = $time -f ($culture).DateTimeFormat.$pattern
Write-Host "$formattedTime"

Вывод, который я получаю,

July 9, 2019 11:22:01 AM
07/09/2019 11:22:01
07/09/2019 11:22:01

Что я хочу получить, это

July 9, 2019 11:26:46 AM
July 9, 2019 11:26:46 AM                 
Tuesday 9 July 2019 11:26:46 

РЕДАКТИРОВАТЬ: Итак, основываясь на ответе IT Delinquent, я попробовал это

$pattern = 'longDateTimePattern'
$date = Get-Date

$format = (Get-Culture).DateTimeFormat.$pattern
$string = ($date).ToString($format)
Write-Host $string

$culture = New-Object system.globalization.cultureinfo('de-DE')
$format = $culture.DateTimeFormat.$pattern
$string = ($date).ToString($format)
Write-Host $string

И он дал мне идентичные результаты.Потому что это не longDateTimePattern, а longDatePattern.Учитывая, что шаблон может стать строкой, предоставленной пользователем, я лучше проверю их.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Ваша попытка использовать оператор -f ошибочна (см. Нижнюю часть).

Чтобы получить желаемый результат, используйте тип [datetime], соответствующий .ToString() overload:

$time.ToString($culture.DateTimeFormat.$pattern, $culture)

Передача $culture в качестве 2-го аргумента гарантирует, что форматирование применяется в контексте этой культуры.

Если вы действительно намерены использовать формат из другой культуры и применить его в контексте текущей культуры, просто пропустите 2-й аргумент (в качестве альтернативы Get-Date -Format подход в вашем вопросе):

$time.ToString($culture.DateTimeFormat.$pattern)

Если нет необходимости привлекать другую культуру, задача становится намного проще благодаря стандартным строкам формата даты и времени , где односимвольные строки, такие как "D", относятся к стандартным форматам например LongDatePattern:

$time.ToString("D")

Вы также можете передать эти строки в Get-Date -Format

Get-Date -Format D

Что касается то, что вы пытались :

Чтобы оператор -f работал правильно, ваша LHS должна быть строкой template с заполнителями ({0} для первого, {1} для во-вторых, ...) для замены операндами RHS.

Используя простой пример:

Format the RHS, an [int], as a number with 2 decimal places.
PS> '{0:N2}' -f 1
1.00

Следовательно, $time -f (Get-Culture).DateTimeFormat.$pattern вообще не выполняет (явное) форматирование, потому что LHS - $time - не содержит никаких заполнителей .

То есть RHS игнорируется , а LHS возвращается в виде строки : Это фактически то же самое, что вызов $time.ToString() в контексте инвариантная культура (поскольку результатом применения оператора -f всегда является string и PowerShell использует инвариантную культуру во многих контекстах, связанных со строками ).

В то время как вы можете включить определенную строку формата даты и времени в заполнитель строки шаблона - следуя за индексом заполнителя с : и строкой форматирования, как показано выше ({0:N2}) - вы также не можете предоставить контекст культуры для него.

Сначала вам придется (временно) переключиться на нужную культуру:

# Save the currently effective culture and switch to the French culture
$prev = [cultureinfo]::CurrentCulture
[cultureinfo]::CurrentCulture = 'fr-FR'

# Format with the desired format string.
"{0:$($culture.DateTimeFormat.$pattern)}" -f $time

[cultureinfo]::CurrentCulture = $prev
0 голосов
/ 09 июля 2019

Я думаю, что это как-то связано с передачей Get-Date с использованием переменной, похоже, она теряет возможность форматирования.Фактически, если вы попытаетесь использовать Write-Host ($date -Format $format), вы получите ошибку:

Неожиданный токен '$ format' в выражении или операторе

Вот мои установочные переменные:

$pattern = 'FullDateTimePattern'
$format = (Get-Culture).DateTimeFormat.$pattern
$date = Get-Date

Как указано выше, использование Write-Host ($date -f $format) и неправильный вывод 07/09/2019 12:24:38.Тем не менее, использование любого из следующих параметров работает и корректно выводит 09 July 2019 12:24:38:

Write-Host (Get-Date -Format $format)
Write-Host (Get-Date).ToString($format)
Write-Host ($date).ToString($format)

Надеюсь, это поможет :)

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