Ваша попытка использовать оператор -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