Como encontro uma localidade que formata a data e a hora da maneira que eu quero?

3

Minha pergunta parece ser simples, mas estou surpreso por não conseguir encontrar a resposta.

Eu moro no Canadá, então en_CA.UTF8 ou en_US.UTF8 são os locais mais apropriados, mas eu realmente não gosto dos formatos de data / hora que eles têm. Concordo com o xkcd ( link ) que existe uma forma de formatar datas: aaaa-mm-dd. Eu até me acostumei a usar o relógio de 24 horas por hora.

Portanto, este é um desastre completo para mim, conforme formatado por en_US.UTF8: "Sáb 27 Jan 2018 05:20:38 PM EST"

Tenho certeza que deve ser uma localidade que usa variantes de

% Y-% m-% d% H:% M:% S% Z

como apropriado para d_fmt, d_t_fmt, date_fmt etc. mas não consigo encontrar uma referência de quais locales usam os formatos.

Eu já vi essa pergunta Melhor prática para personalizar o formato de data / hora em todo o sistema? não tinha respostas, por isso optei por pedir uma nova, pois a minha é ligeiramente diferente, não quero personalizar as localidades, quero poder especificar

LC_TIME = ??

e obtenha o formato "correto". No meu caso, a resposta ideal é um documento de referência que detalha os formatos usados para várias localidades, para que eu possa escolher o LC_TIME mais próximo do que eu quero.

A propósito, eu fiz o exercício de modificar manualmente en_CA.UTF8 com configurações que eu estou feliz, mas isso é muito demorado para fazer em vários ambientes, deve haver uma maneira mais fácil.

    
por stone1343 11.02.2018 / 19:28

2 respostas

2

Os dados de localização na maioria dos sistemas Linux estão definidos em o código fonte glibc ; Explicarei como usar isso para procurar uma localidade correspondente.

Em um clone do repositório, entre em localedata/locales ; cada localidade é um arquivo separado aqui, e o formato de data é determinado pelas d_fmt entradas ( d_t_fmt para data e hora). Eles usam %d , %m e %y como você poderia esperar, mas muitas vezes codificados como pontos de código Unicode; % é <U0025> , d é <U0064> , m é <U006D> e y é <U0079> , com suas contrapartes em maiúsculas 32 pontos.

Rodando

grep -iE 'd_t_fmt.*(%|<U0025>)(y|<U00[57]9>).*(%|<U0025>)(m|<U00[46]D>).*(%|<U0025>)(d|<U00[46]4>)' *

lista um número de candidatos, dos quais en_DK é provavelmente o mais adequado:

$ LC_TIME=en_DK date +%x
2018-02-11
    
por 11.02.2018 / 21:55
0

Como @Stephen Kitt menciona o en_DK is locate que você está procurando, eu também uso if para o aplicativo que determina o formato de data do locale em que eles são executados, por exemplo, thunderbird i tem um script de wrapper como isso para sobrescrevê-lo.

~ / bin / thunderbird

#!/bin/bash

export LC_TIME=en_DK  # or whatever you want
[ "$LC_ALL" != "$LC_TIME" ] && unset LC_ALL # only necessary if set to something different from LC_TIME
exec /usr/bin/thunderbird "$@"
    
por 11.02.2018 / 23:10