Подтвердить что ты не робот

Почему PowerShell всегда использует культуру США при передаче в DateTime?

При попытке прочитать CSV вчера я заметил, что PowerShell всегда использует формат даты в США при использовании [datetime]"date".

Мои региональные настройки верны, а [DateTime]::Parse("date") использует формат даты в Великобритании (дд/мм/гггг).

Является ли это ошибкой или преднамеренным решением? Если это преднамеренное решение, это документировано где угодно?

PS D:\> [DateTime]"12/10/2012"
10 December 2012 00:00:00

PS D:\> [DateTime]::Parse("12/10/2012")
12 October 2012 00:00:00

(Примечание: на американской машине я ожидаю, что эти объекты будут такими же, но не так на моих машинах в Великобритании).

Примечание. Я не хочу менять формат (это файл из внешнего источника), я не хочу форматировать даты в выводе, я знаю, что могу использовать [DateTime]::Parse(). Вопрос заключается в бит, который заканчивается символом ?: -)

4b9b3361

Ответ 1

Это преднамеренное решение. При нажатии строки на DateTime вы можете использовать либо формат braindead US , либо ISO 8601 - [datetime]'2012-10-12' работает просто отлично и гораздо приятнее читать.

Причина, по которой это ограничено и ограничено, заключается в том, что скрипты не должны иметь зависимости от текущей культуры, по крайней мере, для литералов и квази-литералов (например, кастинговых строк). Это серьезная проблема при написании надежных пакетных файлов, и вы, разумеется, не хотите иметь одинаковые проблемы в PowerShell.

Ли Холмс имеет объяснение, которое можно считать полуофициальным, поскольку он/был в команде PowerShell в MS:

Чтобы предотвратить появление тонких проблем интернационализации в ваших сценариях, PowerShell рассматривает [DateTime] '11/26/2007' (константу даты) как функцию языка - так же, как это делает [Double] 10.5 (числовая константа.) Не все культуры используют десятичную точку как разделитель фракций, но языки программирования стандартизируются. Не все культуры используют формат en-US DateTime, что приводит к миллионам ошибок интернационализации, когда люди не считают, что их программное обеспечение работает в этих культурах.

Что Ли забывает упомянуть, это то, что я написал раньше, что работает гораздо более разумный формат ISO 8601.

Документация об этом не существует, к сожалению, в документации PowerShell или в Спецификации языка (v2). Тем не менее, есть очень мало доказательств того, что это указывает на ошибку.