LC_TIME not set correctly by Sys.setlocale() ?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

LC_TIME not set correctly by Sys.setlocale() ?

Joris FA Meys
Related to the following question on Stackoverflow:
https://stackoverflow.com/questions/44723690/unexpected-behavior-of-sys-setlocale#44723690

It appears as if Sys.setlocale() does not update LC_TIME correctly for use
in date formatting. Although R reports that LC_TIME is changed to the new
setting after use of Sys.setlocale(), as.Date() still uses the old
settings. The only way to update this is by specifically using LC_TIME.

Is this a bug or am I overlooking something?

Example:

> Sys.setlocale(locale = "French_Belgium")
[1]
"LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"

> date <- "Dec-11"

> as.Date(date, format = "%b-%d")
[1] NA # expected

> Sys.setlocale(locale = "English_United Kingdom")
[1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United
Kingdom.1252;LC_MONETARY=English_United
Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"

> as.Date(date, format = "%b-%d")
[1] NA # not expected, should be a correct date

> Sys.setlocale("LC_TIME", "English_United Kingdom")
[1] "English_United Kingdom.1252"

> as.Date(date, format = "%b-%d")
[1] "2017-12-11" # expected

> Sys.setlocale(locale = "French_Belgium")
[1]
"LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"

> as.Date(date, format = "%b-%d")
[1] "2017-12-11" # not expected, should be NA

> Sys.setlocale("LC_TIME", "French_Belgium")
[1] "French_Belgium.1252"

> as.Date(date, format = "%b-%d")
[1] NA # expected

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=French_Belgium.1252  LC_CTYPE=French_Belgium.1252
[3] LC_MONETARY=French_Belgium.1252 LC_NUMERIC=C
[5] LC_TIME=French_Belgium.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] shiny_1.0.3

loaded via a namespace (and not attached):
[1] compiler_3.4.0  R6_2.2.1        htmltools_0.3.6 tools_3.4.0
Rcpp_0.12.10
[6] digest_0.6.12   xtable_1.8-2    httpuv_1.3.3    mime_0.5



--
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Mathematical Modelling, Statistics and Bio-Informatics

tel :  +32 (0)9 264 61 79
[hidden email]
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: LC_TIME not set correctly by Sys.setlocale() ?

Prof Brian Ripley
On 23/06/2017 15:35, Joris Meys wrote:
> Related to the following question on Stackoverflow:
> https://stackoverflow.com/questions/44723690/unexpected-behavior-of-sys-setlocale#44723690
>
> It appears as if Sys.setlocale() does not update LC_TIME correctly for use
> in date formatting. Although R reports that LC_TIME is changed to the new
> setting after use of Sys.setlocale(), as.Date() still uses the old
> settings. The only way to update this is by specifically using LC_TIME.
>
> Is this a bug or am I overlooking something?

Try setting the LC_TIME category explicitly.  The mapping of day/month
names used by strptime (not really as.Date, and not taken from LC_TIME)
is then reset.

Since Windows does not have a usable strptime C function, a substitute
is used and its handing of non-English names is not done through the
OS's locale mechanism.

> Example:
>
>> Sys.setlocale(locale = "French_Belgium")
> [1]
> "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
>
>> date <- "Dec-11"
>
>> as.Date(date, format = "%b-%d")
> [1] NA # expected
>
>> Sys.setlocale(locale = "English_United Kingdom")
> [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United
> Kingdom.1252;LC_MONETARY=English_United
> Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
>
>> as.Date(date, format = "%b-%d")
> [1] NA # not expected, should be a correct date
>
>> Sys.setlocale("LC_TIME", "English_United Kingdom")
> [1] "English_United Kingdom.1252"
>
>> as.Date(date, format = "%b-%d")
> [1] "2017-12-11" # expected
>
>> Sys.setlocale(locale = "French_Belgium")
> [1]
> "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
>
>> as.Date(date, format = "%b-%d")
> [1] "2017-12-11" # not expected, should be NA
>
>> Sys.setlocale("LC_TIME", "French_Belgium")
> [1] "French_Belgium.1252"
>
>> as.Date(date, format = "%b-%d")
> [1] NA # expected
>
>> sessionInfo()
> R version 3.4.0 (2017-04-21)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
> Running under: Windows 7 x64 (build 7601) Service Pack 1
>
> Matrix products: default
>
> locale:
> [1] LC_COLLATE=French_Belgium.1252  LC_CTYPE=French_Belgium.1252
> [3] LC_MONETARY=French_Belgium.1252 LC_NUMERIC=C
> [5] LC_TIME=French_Belgium.1252
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>
> other attached packages:
> [1] shiny_1.0.3
>
> loaded via a namespace (and not attached):
> [1] compiler_3.4.0  R6_2.2.1        htmltools_0.3.6 tools_3.4.0
> Rcpp_0.12.10
> [6] digest_0.6.12   xtable_1.8-2    httpuv_1.3.3    mime_0.5
>
>
>


--
Brian D. Ripley,                  [hidden email]
Emeritus Professor of Applied Statistics, University of Oxford

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: LC_TIME not set correctly by Sys.setlocale() ?

Joris FA Meys
Dear prof. Ripley,

thank you for your answer. A few additional questions below.

On Fri, Jun 23, 2017 at 5:25 PM, Prof Brian Ripley <[hidden email]>
wrote:

> On 23/06/2017 15:35, Joris Meys wrote:
>
>> Related to the following question on Stackoverflow:
>> https://stackoverflow.com/questions/44723690/unexpected-beha
>> vior-of-sys-setlocale#44723690
>>
>> It appears as if Sys.setlocale() does not update LC_TIME correctly for use
>> in date formatting. Although R reports that LC_TIME is changed to the new
>> setting after use of Sys.setlocale(), as.Date() still uses the old
>> settings. The only way to update this is by specifically using LC_TIME.
>>
>> Is this a bug or am I overlooking something?
>>
>
> Try setting the LC_TIME category explicitly.  The mapping of day/month
> names used by strptime (not really as.Date, and not taken from LC_TIME) is
> then reset.
>

I have done so in the example, and I am aware that the underlying function
is strptime. I just wondered why setting LC_ALL did not refresh the
mapping, as LC_ALL -afaik- also updates LC_TIME to a new locale

>
> Since Windows does not have a usable strptime C function, a substitute is
> used and its handing of non-English names is not done through the OS's
> locale mechanism.


This explains the behaviour. Is there a reason why this substitute is only
updating the mapping of day/month names when LC_TIME is set explicitly and
not when LC_ALL (and hence also LC_TIME) is set?

Regards
Joris

--
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Mathematical Modelling, Statistics and Bio-Informatics

tel :  +32 (0)9 264 61 79
[hidden email]
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Loading...