Показать полную графическую версию : [решено] День недели по-русски
DJ Mogarych
02-02-2020, 13:16
Привет!
Подскажите, пожалуйста - как мне заставить павершелл возвращать день недели на русском?
Сейчас вот так:
PS C:\temp> (get-date).DayOfWeek
Sunday
Это при том, что Windows русский, все региональные параметры настроены на русский, часовой пояс, местоположение, настройка для программ, не понимающих юникода - всё русское.
В чём дело?
Windows 10 1909 x64 pro.
как мне заставить павершелл возвращать день недели на русском? »
get-date -f dddd
В чём дело? »
Это дотнет перечисление...
Элементы перечисления DayOfWeek не локализованы. Чтобы вернуть локализованное название дня недели, вызовите DateTime.ToString(String) или метод DateTime.ToString(String, IFormatProvider) с помощью строк формата ddd или dddd. Первая строка формата дает сокращенное название дня недели; в последнем выводится полное название дня недели. (https://docs.microsoft.com/ru-ru/dotnet/api/system.dayofweek?view=netframework-4.8)
DJ Mogarych
02-02-2020, 14:10
Вот жеж, а!
Сколько граблей поразложено везде!
Спасибо!
Сколько граблей поразложено везде! »
Угу, голова должна крутиться на 360 градусов, чтобы по лбу не получить... такие индусы. :)
Кстати, если требуется именно точечная нотация, то в цитате метод описан:
(get-date).tostring('dddd')
DJ Mogarych
03-02-2020, 09:27
Хотел ещё спросить.
Есть некий CSV, я его импортирую, и в выборе полей (select) есть такое:
@{n='Время доступа';e={$_.TimeAccessed -as [datetime]}},
@{n='День недели';e={($_.TimeAccessed -as [datetime]).ToString('dddd')}},
Можно ли как-то сделать так, чтобы два раза не преобразовывать строку в datetime?
Типа -outvariable, чтобы вызвать его во второй строке, но у меня не получилось его как-то сюда воткнуть.
DJ Mogarych, можете вторым select вычислять второе свойство :-)
либо через внешнюю переменную:
$externalVar = @{}
[PSCustomObject]@{TimeAccessed='2020-02-03 14:58:03'},[PSCustomObject]@{TimeAccessed='2020-02-01 14:58:03'} | Select-Object @{n='Время доступа';e={ ($externalVar['dateTimeAccessed'] = $_.TimeAccessed -as [datetime])}},@{n='День недели';e={$externalVar['dateTimeAccessed'].ToString('dddd')}}
DJ Mogarych
03-02-2020, 15:52
Спасибо!
В итоге придумал третий способ. Так как в том селекте ещё вместо логина подставлялось ФИО, то, чтобы не искать в выгрузке из AD ФИО для каждой строки, вынес всё в отдельную конструкцию после импорта CSV:
foreach ($user in ($src.'ФИО' |sort -Unique)) {
$fio = (get-aduser $user -Properties displayname -ErrorVariable fioNotFound).displayname
($src.where{$_.'ФИО' -eq $user}).foreach({
if (!($fioNotFound)) {$_.'ФИО' = $fio}
$_.'День недели' = ($_.'Время доступа').tostring('dddd')
})
}
Можно ли как-то сделать так, чтобы два раза не преобразовывать строку в datetime? »
Да, вот Busla уже подсказал как, но в этом нет большого смысла и никакого профита, только усложнится и увеличится код.
В итоге придумал третий способ. »
Ну, через цикл можно и в конвейере было добавить свойство...
...|select @{n='Время доступа';e={$_.timeaccessed -as [datetime]}}|
%{
$_|
add-member -membert noteproperty -name {День недели} -value ($_.'Время доступа').tostring('dddd') -force -pass
}
DJ Mogarych
03-02-2020, 17:35
Вариант!
Когда-то давно стояла похожая задача (нужны были месяцы в родительном падеже да ещё и на украинском). Очень долго сидел над этой проблемой и таки нашел красивый, читабельный и скорее всего наиболее правильный способ.
Выдрал из исходников, актуализировал под эту задачу, пользуйтесь :)
$now = Get-Date
$now.DayOfWeek # Tuesday
$cultureRU = [cultureinfo]::CreateSpecificCulture("ru-RU")
$cultureRU.DateTimeFormat.GetDayName($now.DayOfWeek) # Вторник
$cultureJA = [cultureinfo]::CreateSpecificCulture("ja-JA") # japanese
$cultureJA.DateTimeFormat.GetDayName($now.DayOfWeek) # 火曜日
greg zakharov
04-02-2020, 17:43
Очень долго сидел над этой проблемой и таки нашел красивый, читабельный и скорее всего наиболее правильный способ.Наиболее правильный способ был показан YuS_2. Почему? Командлет Get-Date спроектирован относительно пространства имен System.Globalization, так что ваш код избыточен вдвойне, если учесть наличие командлета Get-Culture:
(Get-Culture ru-RU).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # вторник
(Get-Culture ja-JP).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # 火曜日
(Get-Culture uk-UA).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # вiвторок
greg zakharov, я честно говоря не улавливаю причинно-следственных связей.
Про командлет Get-Culture не знал, а в остальном приведенный код идентичен моему, за исключением количества вызовов Get-Date.
Про командлет Get-Culture не знал, а в остальном приведенный код идентичен моему, за исключением количества вызовов Get-Date. »
Не совсем идентичный, хоть и построен одинаково. У Вас текущая дата сохраняется в переменной и становится константой. В большинстве случаев это не проблема (ибо получаем всего навсего, день недели), но в пограничных случаях перехода даты, может получится не запланированное смещение... (повторюсь, чаще всего, это мелкая и не критичная проблема, в том числе и по потреблению памяти).
Кстати, Ваш способ хорош ещё и тем, что можем получать название не только на языке системы, но и на том, который запросили. А правильно/неправильно - категории относительные, имхо.
Не совсем идентичный, хоть и построен одинаково. У Вас текущая дата сохраняется в переменной и становится константой. В большинстве случаев это не проблема (ибо получаем всего навсего, день недели), но в пограничных случаях перехода даты, может получится не запланированное смещение... (повторюсь, чаще всего, это мелкая и не критичная проблема, в том числе и по потреблению памяти). »
А, ну это вопрос скорее архитектурный. Где-то нужно брать отправную точку и считать\преобразовывая относительно, а где-то нужно иметь данные "на сейчас". Тут правильно\неправильно не бывает, задачи то разные.
Ну и да, я изначально думал что задача именно "получить день недели на любом языке".
А на то что DayOfWeek не локализован я вообще не знал, у меня ОС английская и для меня было логично что и дни недели на английском :D
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.