Marca de tiempo de Unix a cadena de fecha y hora

8

Dada una marca de tiempo de Unix como entrada, proporcione una cadena de fecha y hora, en un formato como este: "YYMMDD.HHmm"

Reglas

  • La entrada es un número (entero) de un tiempo de época UNIX preciso en milisegundos (milisegundos desde el 1 de enero de 1970 00: 00: 00,000 UTC).
  • Los valores deben rellenarse con ceros si tienen 1 carácter en lugar de 2. (por ejemplo: para "DD", "1" no es aceptable, pero "01" sí).
  • La salida debe ser una sola cadena. No hay matrices.
  • El segundo salto no importa.
  • Las victorias más cortas.

¡Buena suerte!

Ejemplo

Input: 1547233866744
Output: 190111.1911
skiilaa
fuente
2
Bienvenido a PPCG! Buen desafío, pero hay algunas aclaraciones por hacer. Para que el desafío sea autónomo, probablemente deberías explicar qué es la época de Unix. Además, ¿qué se debe hacer con los segundos bisiestos? ¿Qué se debe hacer con el problema del año 2038?
AdmBorkBork
1
@AdmBorkBork Editó la publicación para explicar qué es la época de Unix. La segunda implementación de salto no importa, ya que la cadena de salida no es de segunda precisión. El problema del año 2038 no importa actualmente, ya que podría ser una limitación del dispositivo en ejecución o del lenguaje de programación elegido.
skiilaa
1
¿Importa la zona horaria?
Erik the Outgolfer
¿Supongo que el año está representado por un número de dos dígitos?
Encarnación de la ignorancia el
1
@ Las zonas horarias de FabianRöling no importan.
skiilaa

Respuestas:

3

Japt v1.4.5 , 19 16 bytes

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

1 byte guardado gracias a Oliver , lo que llevó a otros 2 bytes guardados.

Intentalo


Explicación

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 / Consejos

Lanudo
fuente
8

JavaScript (ES6), 65 bytes

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

Pruébalo en línea!

¿Cómo?

Inicializamos el puntero en un valor no numérico (forzado a ) y luego agregamos alternativamente y para elegir los caracteres relevantes de la conversión ISO-8601 de la marca de tiempo de entrada.i021

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

JavaScript (ES6), 66 bytes

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

Pruébalo en línea!

¿Cómo?

Una vez que la marca de tiempo de entrada se convierte en formato ISO-8601, se puede acceder a todos los caracteres requeridos con un solo dígito hexadecimal.

yyyy-mm-ddThh:mm:ss.sssZ
  ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
0123456789ABCDEF
Arnauld
fuente
Guau. Simplemente guau.
skiilaa
1
64 bytes:n=>'235689.11121415'.replace(/1?\w/g,x=>new Date(n).toJSON()[x])
tsh
@tsh Nice! No esperaba que el formato decimal fuera más corto. Es posible que desee publicar esto como una respuesta separada.
Arnauld
7

PHP , 40 32 31 bytes

-8 bytes gracias a Luis felipe
-1 byte gracias a Jo King

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

Pruébalo en línea!

Simple respuesta ingenua. La datefunción de PHP toma una cadena de formato y una marca de tiempo entera. Entrada de argumentos cli, que es una cadena por defecto, entonces /1e3porque dateespera marcas de tiempo de segunda precisión. Esto también obliga a la cadena a un número.

Skidsdev
fuente
¡Buena respuesta! Es un poco más corto si el idioma tiene formato de fecha, sí :)
skiilaa
32 bytes que no necesita convertir a entero ya que "2"/1lanzará automáticamente la cadena
Luis felipe De jesus Munoz
ah, por supuesto, agregué intval antes de darme cuenta de que lo necesitaba /1000, y no pensé que no lo necesitaría después: P
Skidsdev
@JoKing ah agradable, gracias
Skidsdev
5

MATL , 28 bytes

Gracias a @skiilaa por una corrección en el formato de salida.

864e5/719529+'YYmmDD.HHMM'XO

Pruébalo en línea!

Explicación

MATL, como MATLAB, define los números de fecha / hora como el número (posiblemente no entero) de días desde la hora 00:00 de la "fecha" de referencia 0-enero-0000.

Por lo tanto, tomamos la entrada, la dividimos entre 86400000 (número de milisegundos en un día), agregamos 719529 (número de días desde la referencia de MATL a la referencia de UNIX) y la convertimos al formato deseado 'YYmmDD.HHMM'.

Luis Mendo
fuente
5

PowerShell , 59 58 bytes

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

Pruébalo en línea!

Obtiene el Datede 1/1/1970(el valor predeterminado es 00:00:00 am) y luego Addel número apropiado de Seconds. Pasa eso al -foperador ormat, que formatea correctamente la fecha y hora.

Probablemente dependiente de la cultura. Esto funciona en TIO, que es en-us.

-1 byte gracias a shaggy.

AdmBorkBork
fuente
4

GNU AWK, 34 33 caracteres

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

( strftime()es la extensión GNU, no se ejecutará en otras implementaciones de AWK).

Gracias a:

Muestra de ejecución:

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

Pruébalo en línea!

hombre trabajando
fuente
Gracias, @JoKing. Desafortunadamente, E-notation no es realmente mi amigo, así que siempre lo olvido.
manatwork
3

Perl 6 ,  111 89  87 bytes

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

Pruébalo (111)

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

Pruébalo (89)

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

Pruébalo (87)

Explicación:

El ooperador infijo toma dos funciones y crea una función compuesta. Primero se llama al que está más a la derecha, y al que está a la izquierda se llama con su resultado.

Básicamente usamos 4 lambdas de bloque para generar una sola lambda.

Lo que no es muy diferente de cómo * + *se crea un Lambda de WhateverCode .


Dividir por 1000 y usar eso para crear un objeto DateTime.

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

El resultado se usa por:

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

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

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

Eso nos deja con una cuerda como 2019-01-11.19 11

Necesitamos eliminar los dos primeros dígitos.

{S/..//}

También necesitamos eliminar -y

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

Python 2 , 64 bytes

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

Pruébalo en línea!

La entrada se considera en UTC.

Erik el Outgolfer
fuente
1
Justo como algo en lo que he estado un poco confundido, ¿es la única razón por la que lambdaviene antes importporque funciona mejor para el encabezado de TIO?
Neil A.
2
@NeilA. Si. La importación puede ir antes o después, el contenido de la lambda no se verifica NameErrorantes de llamarlo.
Erik the Outgolfer
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));}

Pruébalo en línea!

En una plataforma ILP64, la siguiente versión de 55 bytes debería funcionar:

f(t,s){t/=1e3;strftime(s,12,"%y%m%d.%H%M",gmtime(&t));}
nwellnhof
fuente
¿Cuál es el sargumento adicional que estás tomando?
Shaggy
1
@Shaggy El ses para la cadena de salida.
nwellnhof el
Parece que lo estás iniciando fuera de la función; ¿Tenemos un meta consenso que permita a C hacer eso?
Shaggy
@ Shaggy No estoy seguro de qué significa "consenso" exactamente, pero aquí está la meta publicación relevante .
nwellnhof el
Con "32-bit", ¿por qué long longen lugar de longo int32_t, int64_t, time_t? IAC, todo más corto que long long.
chux - Restablecer Monica
2

Perl 6 , 57 50 bytes

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

Pruébalo en línea!

Toma la cadena de caracteres predeterminada de una fecha y hora, en el formato yyyy-mm-ddThh:mm:ssZy la modifica para que se ajuste al formato de salida. Perl 6 necesita un método de formateador de fecha.

Explicación:

                       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 '-'
Jo King
fuente
2

Javascript ES6, 76 66 bytes

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

Pruébalo en línea

-10 bytes gracias 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
fuente
3
Es posible que desee esperar un día más o menos antes de responder sus propias preguntas la próxima vez.
fəˈnɛtɪk
71 bytes
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz, eso es lo suficientemente diferente para que puedas publicar tu mismo.
Shaggy
@LuisfelipeDejesusMunoz 66 bytes para vincularte con Arnauld.
Shaggy
2

C (clang) , 117111 bytes

Gracias a @chux y @ceilingcat por las sugerencias.

#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]);}

Pruébalo en línea!

ErikF
fuente
gmtimees corto quelocaltime
chux - Restablece a Mónica el
2

Ramita, 25 caracteres

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

Esta es una plantilla. Llámelo incluyéndolo y pase el tiempo Unix como parámetro d.

Uso de la muestra:

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

Pruébalo en TwigFiddle

hombre trabajando
fuente
1

jq, 33 caracteres

(Código de 30 caracteres + opción de línea de comando de 3 caracteres)

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

Ejecución de muestra:

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

Pruébalo en línea!

hombre trabajando
fuente
3
Ya no necesita contar banderas de línea de comandos.
AdmBorkBork
Ups Bueno saber. Gracias @AdmBorkBork.
manatwork
1000->1e3
Shaggy
1

MediaWiki, 46 bytes

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

Java 8, 78 bytes

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

Pruébalo en línea.

Explicación:

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
fuente