Как пунктуально выводить дату на другом языке в R

#r #date #output

#r #Дата #вывод

Вопрос:

Я обычно устанавливаю свою рабочую среду на английском, хотя это не мой родной язык, потому что большинство дат, которые я использую при вводе, именно так.

Однако иногда мне приходится выводить дату в длинном формате на другом языке, обычно на французском.

 library(lubridate) 
today()
> today()
[1] "2020-12-22"
 

То есть мне нужна функция, которая дает :

 DateInLongFormatInFrench(today)
[1] "Mardi 22 décembre"
 

Что по-французски означает «вторник, 22 декабря». И я бы хотел, чтобы решение не меняло языковые настройки для всей программы, а только для этого экземпляра.

Я нашел много сообщений о том, как читать даты, но не так много о том, как их выводить

Комментарии:

1. Это будет зависеть от ваших настроек локали. В противном случае format(today(), '%A %d %B') должно работать

2. withr Пакет полезен для изменения настроек локали для одной строки. (Хотя у меня возникли проблемы с Windows с французским языком — вам может быть легче, если вы не в Windows.) Но если вы можете найти правильные настройки локали / ваша ОС более совместима, чем моя, что-то вроде withr::with_locale("LC_TIME" = "fr_FR", format(today(), '%A %d %B')) должно сработать.

Ответ №1:

Преобразуйте даты в строки, используя format.Date

 format(<my_date>, "%A %d %B")
 

Для вашего региона должна быть установлена франкоязычная область, например

 Sys.setlocale("LC_TIME", "fr_FR")
 

Если вам нужно сделать это изолированно:

 frenchDate <- function(x) {
  locale <- Sys.getlocale("LC_TIME")
  
  # when function exits, restore original locale
  on.exit(Sys.setlocale("LC_TIME", locale))

  Sys.setlocale("LC_TIME", "fr_FR")

  format(x, "%A %d %B")
}
 

Комментарии:

1. обратите внимание для будущих читателей, что языковой стандарт также должен быть доступен: я получаю «Запрос отчетов ОС для установки языкового стандарта на ‘fr_FR’ не может быть выполнен», предположительно, потому, что он не установлен

2. Я думаю, что это правильный путь. При желании ее можно немного обобщить, используя function(x, format = "%A %d %B", locale = "fr_FR") { ...; format(x, format = format); } , таким образом, не жестко закодированные форматы и локали. (Это предполагает имя, подобное format_locale или похожее.)

3. Да, имена локалей зависят от операционной системы. ?locales имеет довольно хорошее краткое изложение.