Registro de data e hora Unix para cadeia de data e hora

8

Dado um registro de data e hora unix como entrada, forneça uma string de data e hora, em um formato como este: "YYMMDD.HHmm"

Regras

  • A entrada é um número (inteiro) de um tempo de época UNIX de milissegundos preciso (milissegundos desde 1970, 1º de janeiro de 00: 00: 00.000 UTC).
  • Os valores devem ser preenchidos com zeros se tiverem 1 caractere em vez de 2. (por exemplo: para "DD", "1" não é aceitável, mas "01" é).
  • A saída deve ser uma única sequência. Sem matrizes.
  • O segundo salto não importa.
  • Vitórias mais curtas.

Boa sorte!

Exemplo

Input: 1547233866744
Output: 190111.1911
skiilaa
fonte
2
Bem-vindo ao PPCG! Bom desafio, mas há alguns esclarecimentos a serem feitos. Para tornar o desafio independente, você provavelmente deve explicar qual é a época do Unix. Além disso, o que deve ser feito com segundos bissextos? O que deve ser feito com o problema do ano 2038?
AdmBorkBork 11/01/19
1
@AdmBorkBork Editou a postagem para explicar qual é a época do Unix. A implementação do segundo salto não importa, pois a sequência de saída não é segunda precisa. Atualmente, o problema do ano 2038 não importa, pois pode ser uma limitação do dispositivo em execução ou da linguagem de programação escolhida.
precisa saber é o seguinte
1
O fuso horário importa?
Erik the Outgolfer
Presumo que o ano seja representado por um número de dois dígitos?
Modalidade de ignorância
1
@ Os fusos horários FabianRöling não importam.
skiilaa

Respostas:

3

Japt v1.4.5 , 19 16 bytes

GîÐU s3)¤o>J i.G

1 byte salvo graças a Oliver , o que levou a outros 2 bytes salvos.

Tente


Explicação

GîÐU s3)¤o>J i.G
                     :Implicit input of integer U
G                    :16
 î                   :Get the first 16 characters of the following string
  ÐU                 :  Convert U to a date object
     s3              :  Convert to ISO string
       )             :End get
        ¤            :Slice off the first 2 characters
         o           :Filter
          >J         :  Greater than -1
             i.G     :Insert "." at 0-based index 16, with wrapping

Notas / Dicas

Shaggy
fonte
8

JavaScript (ES6), 65 bytes

n=>'101010.1010'.replace(i=/\d/g,x=>new Date(n).toJSON()[i=x-~i])

Experimente online!

Quão?

i021

yyyy-mm-ddThh:mm:ss.sssZ
  ^^ ^^ ^^ ^^ ^^

JavaScript (ES6), 66 bytes

n=>'235689.BCEF'.replace(/\w/g,x=>new Date(n).toJSON()[+`0x${x}`])

Experimente online!

Quão?

Depois que o registro de data e hora de entrada é convertido no formato ISO-8601, todos os caracteres necessários podem ser acessados ​​com um único dígito hexadecimal.

yyyy-mm-ddThh:mm:ss.sssZ
  ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
0123456789ABCDEF
Arnauld
fonte
Uau. Apenas Uau.
skiilaa
1
64 bytes:n=>'235689.11121415'.replace(/1?\w/g,x=>new Date(n).toJSON()[x])
tsh 14/01
@tsh Nice! Eu não esperava que o formato decimal fosse mais curto. Você pode postar isso como uma resposta separada.
Arnauld
7

PHP , 40 32 31 bytes

-8 bytes graças a Luis felipe
-1 byte graças a Jo King

<?=date('ymd.hi',$argv[1]/1e3);

Experimente online!

Resposta ingênua simples. A datefunção do PHP usa uma string de formato e um registro de data e hora inteiro. Entrada de argumentos cli, que é uma string por padrão, /1e3porque dateespera registros de data e hora com segunda precisão. Isso também força a cadeia a um número.

Skidsdev
fonte
Boa resposta! É um pouco mais curto se a língua tem formatação de data, sim :)
skiilaa
32 bytes você não precisa elenco para número inteiro desde "2"/1elenco vontade automaticamente a string
Luis Felipe de Jesus Munoz
ah, é claro, adicionei intval antes de perceber que precisava /1000e não achei que não fosse necessário depois: P
Skidsdev
@JoKing ah bom um, graças
Skidsdev
5

MATL , 28 bytes

Obrigado a @skiilaa por uma correção no formato de saída.

864e5/719529+'YYmmDD.HHMM'XO

Experimente online!

Explicação

MATL, como MATLAB, define números de data / hora como o número (possivelmente não inteiro) de dias desde a hora 00:00 da referência "data" 0-Jan-0000.

Assim, pegamos a entrada, dividimos por 86400000 (número de milissegundos em um dia), adicionamos 719529 (número de dias da referência do MATL à referência do UNIX) e convertemos para o formato desejado 'YYmmDD.HHMM'.

Luis Mendo
fonte
5

PowerShell , 59 58 bytes

"{0:yyMMdd.HHmm}"-f(Date 1/1/1970).AddSeconds("$args"/1e3)

Experimente online!

Obtém o Datede 1/1/1970(o padrão é 00:00:00) e, em seguida, Addé o número apropriado de Seconds. Passa isso para o -foperador ormat, que formata corretamente a data e hora.

Provavelmente dependente da cultura. Isso funciona no TIO, que é en-us.

-1 byte graças a shaggy.

AdmBorkBork
fonte
4

GNU AWK, 34 33 caracteres

$0=strftime("%y%m%d.%H%M",$0/1e3)

( strftime()é a extensão GNU, não será executado em outras implementações do AWK.)

Graças a:

Execução do amostrador:

bash-4.4$ awk '$0=strftime("%y%m%d.%H%M",$0/1e3)' <<< 1547233866744
190111.2111

Experimente online!

homem a trabalhar
fonte
Obrigado, @JoKing. Infelizmente, a notação eletrônica não é realmente minha amiga, então eu sempre a esqueço.
manatwork
3

Perl 6 ,  111 89  87 bytes

{~DateTime.new($_/Ⅿ,:formatter{"{(.year%Ⅽ,.month,.day).fmt('%02d','')}.{(.hour,.minute).fmt('%02d','')}"})}

Experimente (111)

{TR/-//}o{S/..//}o{.yyyy-mm-dd~'.'~(.hour,.minute).fmt('%02d','')}o{DateTime.new($_/Ⅿ)}

Experimente (89)

{TR/- //}o{S/..//}o{.yyyy-mm-dd~'.'~(.hour,.minute).fmt('%02d')}o{DateTime.new($_/Ⅿ)}

Experimente (87)

Explicação:

O ooperador infix assume duas funções e cria uma função composta. O da direita é chamado primeiro e o da esquerda é chamado com o resultado.

Basicamente, usamos lambdas de 4 blocos para gerar uma única lambda.

O que não é muito diferente de como * + *é criado um lambda WhateverCode .


Divida por 1000 e use-o para criar um objeto DateTime.

{DateTime.new($_/Ⅿ)} # Ⅿ is ROMAN NUMERAL ONE THOUSAND (3 bytes)

O resultado é usado por:

{
   .yyyy-mm-dd # 2019-01-11

   ~ '.' ~     # str concatenation with '.'

   ( .hour, .minute ).fmt('%02d') # add leading 0s (returns List)
}

Isso nos deixa com uma corda como 2019-01-11.19 11

Precisamos remover os dois primeiros dígitos

{S/..//}

Também precisamos remover -e

{TR/- //}
Brad Gilbert b2gills
fonte
3

Python 2 , 64 bytes

lambda s:strftime('%y%m%d.%H%M',gmtime(s/1e3))
from time import*

Experimente online!

A entrada é considerada em UTC.

Erik, o Outgolfer
fonte
1
Assim como algo que eu tenho me confundido um pouco, é a única razão pela qual ela lambdavem antes do importporque funciona melhor no cabeçalho do TIO?
Neil A.
2
@NeilA. Sim. A importação pode ocorrer antes ou depois, o conteúdo do lambda não é verificado por NameErrors antes de ser chamado.
Erik the Outgolfer
3

R , 58 56 bytes

format(as.POSIXct(scan()/1e3,,'1970-1-1'),'%y%m%d.%H%M')

Experimente online!

digEmAll
fonte
3

C (gcc) (32 bits, little endian), 67 bytes

f(t,s)long long t;{t/=1e3;strftime(s,12,"%y%m%d.%H%M",gmtime(&t));}

Experimente online!

Em uma plataforma ILP64, a seguinte versão de 55 bytes deve funcionar:

f(t,s){t/=1e3;strftime(s,12,"%y%m%d.%H%M",gmtime(&t));}
Nwellnhof
fonte
Qual é o sargumento extra que você está adotando?
Shaggy
1
@ Shaggy O sé para a string de saída.
Nwellnhof 12/01/19
Parece que você está iniciando fora da função; temos um meta consenso que permita que C faça isso?
Shaggy
@ Shaggy Não sei ao certo o que "consenso" significa exatamente, mas aqui está o meta post relevante .
Nwellnhof 12/01/19
Com "32-bit", porque long longem vez de longou int32_t, int64_t, time_t? IAC, todos menores que long long.
Chux - Reintegrar Monica
2

Perl 6 , 57 50 bytes

{TR:d/T:-/./}o{substr ~DateTime.new($_/1e3): 2,15}

Experimente online!

Pega a stringificação padrão de um Datetime, no formato yyyy-mm-ddThh:mm:ssZe a modifica para se ajustar ao formato de saída. O Perl 6 precisa de um método de formatador de data.

Explicação:

                       Datetime.new($_/1e3) # Create a date time
                      ~                 # Stringify it to the format yyyy-mm-ddThh:mm:ssZ
                                        # e.g. 2019-01-11T19:11:06.744000Z
               substr                      : 2,15  # Take the middle 15 characters
 {TR:d/T  /./}o   # Then replace 'T' with '.'
        :-        # Then remove ':' and '-'
Brincadeira
fonte
2

Javascript ES6, 76 66 bytes

x=>new Date(x).toJSON().slice(2,16).replace(/\D/g,a=>a>'S'?'.':'')

Experimente online

-10 bytes graças a Shaggy!


x // timestamp
=>
new Date(x) // date object from timestamp
.toJSON() // same as .toISOString()
.slice(2,16) // cut off excess
.replace(/\D/g, // match all non-digits
a // a is matched character
=>
a>'S'?'.' // if a is T (bigger than S is shorter) replace it with .
:''       // if it's not T, replace it with nothing
          // this way the dashes get removed and the dot gets put in the right place
) // end of replace
skiilaa
fonte
3
Você pode esperar um dia ou mais antes de responder suas próprias perguntas na próxima vez.
fəˈnɛtɪk 11/01/19
71 bytes
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz, isso é diferente o suficiente para você se publicar.
Shaggy
@LuisfelipeDejesusMunoz 66 bytes para amarrá-lo com Arnauld.
Shaggy
2

C (clang) , 117 111 bytes

Obrigado a @chux e @ceilingcat pelas sugestões.

#import<time.h>
*l;f(long t){t/=1e3;printf("%02d%02d%02d.%02d%02d",5[l=gmtime(&t)]%100,l[4]+1,l[3],l[2],l[1]);}

Experimente online!

ErikF
fonte
gmtimeé curto quelocaltime
chux - Reinstala Monica
2

Galho, 25 caracteres

{{d[:-3]|date('ymd.hi')}}

Este é um modelo. Chame-o incluindo-o e passe o tempo do Unix como parâmetro d.

Uso da amostra:

{{include('datetime.twig', {'d': 1547233866744})}}

Experimente no TwigFiddle

homem a trabalhar
fonte
1

jq, 33 caracteres

(Código de 30 caracteres + opção de linha de comando de 3 caracteres)

./1000|strftime("%y%m%d.%H%M")

Exemplo de execução:

bash-4.4$ jq -r './1000|strftime("%y%m%d.%H%M")' <<< 1547233866744
190111.1911

Experimente online!

homem a trabalhar
fonte
3
Você não precisa mais contar sinalizadores de linha de comando.
AdmBorkBork 11/01/19
Opa Bom saber. Obrigado @AdmBorkBork.
manatwork 11/01/19
1000->1e3
Salsicha
1

MediaWiki, 46 bytes

{{#time:ymd.Hi|@{{#expr:floor({{{1}}}/1e3)}}}}
tsh
fonte
1

Java 8, 78 bytes

n->new java.text.SimpleDateFormat("yyMMdd.HHmm").format(new java.util.Date(n))

Experimente online.

Explicação:

n->                       // Method with long parameter and String return-type
  new java.text.SimpleDateFormat("yyMMdd.HHmm")
                          //  Create the formatter
   .format(               //  Format the date to a String in this format and return it:
     new java.util.Date(  //   Create a new Date
      n))                 //   With the input-long as timestamp
Kevin Cruijssen
fonte