Unix-Zeitstempel zur Datums- / Uhrzeitzeichenfolge

8

Geben Sie bei Eingabe eines Unix-Zeitstempels als Eingabe eine Datums- / Uhrzeitzeichenfolge in einem Format wie dem folgenden an: "YYMMDD.HHmm"

Regeln

  • Die Eingabe ist eine Zahl (Ganzzahl) einer millisekundengenauen UNIX-Epochenzeit (Millisekunden seit 1970, 1. Januar 00: 00: 00.000 UTC).
  • Die Werte müssen mit Nullen aufgefüllt werden, wenn sie 1 Zeichen anstelle von 2 sind. (Beispiel: Für "DD" ist "1" nicht akzeptabel, "01" jedoch.)
  • Die Ausgabe muss eine einzelne Zeichenfolge sein. Keine Arrays.
  • Schaltsekundenhandling spielt keine Rolle.
  • Kürzeste Siege.

Viel Glück!

Beispiel

Input: 1547233866744
Output: 190111.1911
Skiilaa
quelle
2
Willkommen bei PPCG! Schöne Herausforderung, aber es gibt ein paar Klarstellungen. Um die Herausforderung in sich geschlossen zu halten, sollten Sie wahrscheinlich erklären, was die Unix-Epoche ist. Was ist zusätzlich mit Schaltsekunden zu tun? Was ist mit dem Problem des Jahres 2038 zu tun?
AdmBorkBork
1
@AdmBorkBork Der Beitrag wurde bearbeitet, um die Unix-Epoche zu erläutern. Die Implementierung einer Schaltsekunde spielt keine Rolle, da die Ausgabezeichenfolge nicht sekundengenau ist. Das Problem des Jahres 2038 spielt derzeit keine Rolle, da es eine Einschränkung des laufenden Geräts oder der gewählten Programmiersprache sein kann.
Skiilaa
1
Ist die Zeitzone wichtig?
Erik der Outgolfer
Ich nehme an, das Jahr wird durch eine zweistellige Zahl dargestellt?
Verkörperung der Unwissenheit
1
@ FabianRöling Zeitzonen spielen keine Rolle.
Skiilaa

Antworten:

3

Japt v1.4.5 , 19 16 Bytes

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

Dank Oliver wurde 1 Byte gespeichert , was zu weiteren 2 gespeicherten Bytes führte.

Versuch es


Erläuterung

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

Hinweise / Tipps

Zottelig
quelle
8

JavaScript (ES6), 65 Byte

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

Probieren Sie es online aus!

Wie?

Wir initialisieren den Zeiger auf einen nicht numerischen Wert (erzwungen auf ) und addieren dann abwechselnd und , um die relevanten Zeichen aus der ISO-8601-Konvertierung des Eingabezeitstempels auszuwählen.i021

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

JavaScript (ES6), 66 Byte

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

Probieren Sie es online aus!

Wie?

Sobald der eingegebene Zeitstempel in das ISO-8601-Format konvertiert wurde, kann auf alle erforderlichen Zeichen mit einer einzelnen hexadezimalen Ziffer zugegriffen werden.

yyyy-mm-ddThh:mm:ss.sssZ
  ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
0123456789ABCDEF
Arnauld
quelle
Beeindruckend. Einfach wow.
Skiilaa
1
64 Bytes:n=>'235689.11121415'.replace(/1?\w/g,x=>new Date(n).toJSON()[x])
tsh
@tsh Schön! Ich hatte nicht erwartet, dass das Dezimalformat kürzer sein würde. Möglicherweise möchten Sie dies als separate Antwort veröffentlichen.
Arnauld
7

PHP , 40 32 31 Bytes

-8 Bytes dank Luis Felipe
-1 Bytes dank Jo King

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

Probieren Sie es online aus!

Einfache naive Antwort. Die PHP- dateFunktion verwendet eine Formatzeichenfolge und einen ganzzahligen Zeitstempel. Eingabe von cli-Argumenten, die standardmäßig eine Zeichenfolge sind, /1e3da datezweitgenaue Zeitstempel erwartet werden. Dies zwingt den String auch zu einer Zahl.

Skidsdev
quelle
Gute Antwort! Es ist ein bisschen kürzer, wenn die Sprache Datumsformatierung hat, ja :)
Skiilaa
32 Bytes, die Sie nicht in eine Ganzzahl "2"/1
umwandeln
ah natürlich, ich fügte intval hinzu, bevor mir klar wurde /1000, dass ich es brauchte , und dachte nicht, dass ich es danach nicht mehr brauchen könnte: P
Skidsdev
@ JoKing ah schön, danke
Skidsdev
5

MATL , 28 Bytes

Vielen Dank an @skiilaa für eine Korrektur im Ausgabeformat.

864e5/719529+'YYmmDD.HHMM'XO

Probieren Sie es online aus!

Erläuterung

MATL definiert wie MATLAB Datums- / Zeitnummern als die (möglicherweise nicht ganzzahlige) Anzahl von Tagen seit der Zeit 00:00 des Referenz- "Datums" 0-Jan-0000.

Daher nehmen wir die Eingabe, dividieren sie durch 86400000 (Anzahl der Millisekunden an einem Tag), addieren 719529 (Anzahl der Tage von MATLs Referenz zu UNIX-Referenz) und konvertieren in das gewünschte Format 'YYmmDD.HHMM'.

Luis Mendo
quelle
5

PowerShell , 59 58 Byte

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

Probieren Sie es online aus!

Ruft das Datevon ab 1/1/1970(standardmäßig 00:00:00 Uhr), dann Adddie entsprechende Anzahl von Seconds. -fÜbergibt das an den ormat-Operator, der die datetime korrekt formatiert.

Wahrscheinlich kulturabhängig. Dies funktioniert auf TIO en-us.

-1 Byte dank Shaggy.

AdmBorkBork
quelle
4

GNU AWK, 34 33 Zeichen

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

( strftime()Ist eine GNU-Erweiterung und wird in anderen AWK-Implementierungen nicht ausgeführt.)

Dank an:

Probelauf:

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

Probieren Sie es online aus!

Mann bei der Arbeit
quelle
Vielen Dank, @JoKing. Leider ist die E-Notation nicht wirklich mein Freund, deshalb vergesse ich sie immer.
Manatwork
3

Perl 6 ,  111 89  87 Bytes

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

Probieren Sie es aus (111)

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

Probieren Sie es aus (89)

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

Probieren Sie es aus (87)

Erläuterung:

Der oInfix-Operator übernimmt zwei Funktionen und erstellt eine zusammengesetzte Funktion. Der ganz rechts wird zuerst aufgerufen, und der links wird mit seinem Ergebnis aufgerufen.

Grundsätzlich verwenden wir 4 Block Lambdas, um ein einzelnes Lambda zu erzeugen.

Das unterscheidet sich nicht wesentlich davon, wie ein WhateverCode-Lambda * + *erstellt wird.


Teilen Sie durch 1000 und erstellen Sie damit ein DateTime-Objekt.

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

Das Ergebnis wird verwendet von:

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

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

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

Das lässt uns mit einer Schnur wie 2019-01-11.19 11

Wir müssen die ersten beiden Ziffern entfernen

{S/..//}

Wir müssen auch entfernen -und

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

Python 2 , 64 Bytes

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

Probieren Sie es online aus!

Die Eingabe wird als in UTC betrachtet.

Erik der Outgolfer
quelle
1
Genau wie etwas, bei dem ich etwas verwirrt war, ist der einzige Grund, warum das vor dem lambdakommt, importweil es für den TIO-Header besser funktioniert?
Neil A.
2
@NeilA. Ja. Der Import kann entweder vorher oder nachher erfolgen, der Inhalt des Lambda wird NameErrorvor dem Aufruf nicht auf s überprüft .
Erik der Outgolfer
3

C (gcc) (32-Bit, Little Endian), 67 Bytes

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

Probieren Sie es online aus!

Auf einer ILP64-Plattform sollte die folgende 55-Byte- Version funktionieren:

f(t,s){t/=1e3;strftime(s,12,"%y%m%d.%H%M",gmtime(&t));}
nwellnhof
quelle
Was ist das zusätzliche sArgument, für das Sie sich entscheiden?
Shaggy
1
@Shaggy Das sist für die Ausgabezeichenfolge.
Nwellnhof
Es sieht so aus, als würden Sie es außerhalb der Funktion initiieren. Haben wir einen Meta-Konsens, der es C ermöglicht, dies zu tun?
Shaggy
@Shaggy Ich bin mir nicht sicher, was "Konsens" genau bedeutet, aber hier ist der relevante Meta-Beitrag .
Nwellnhof
Mit "32-Bit", warum long longstatt longoder int32_t, int64_t, time_t? IAC, alle kürzer als long long.
chux
2

Perl 6 , 57 50 Bytes

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

Probieren Sie es online aus!

Übernimmt die Standardzeichenfolge einer Datetime im Format yyyy-mm-ddThh:mm:ssZund ändert sie an das Ausgabeformat. Perl 6 benötigt eine Datumsformatierungsmethode.

Erläuterung:

                       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 '-'
Scherzen
quelle
2

Javascript ES6, 76 66 Bytes

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

Probieren Sie es online aus

-10 Bytes dank 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
quelle
3
Vielleicht möchten Sie einen Tag oder so warten, bevor Sie das nächste Mal Ihre eigenen Fragen beantworten.
fəˈnɛtɪk
71 Bytes
Luis Felipe De Jesus Munoz
1
@LuisfelipeDejesusMunoz, das ist anders genug, damit du dich selbst posten kannst.
Shaggy
@LuisfelipeDejesusMunoz 66 Bytes , um dich mit Arnauld zu verbinden.
Shaggy
2

C (Klirren) , 117 111 Bytes

Vielen Dank an @chux und @ceilingcat für die Vorschläge.

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

Probieren Sie es online aus!

ErikF
quelle
gmtimeist kurz alslocaltime
chux
2

Zweig, 25 Zeichen

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

Dies ist eine Vorlage. Rufen Sie es auf, indem Sie es einschließen, und übergeben Sie die Unix-Zeit als Parameter d.

Beispielnutzung:

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

Probieren Sie es auf TwigFiddle aus

Mann bei der Arbeit
quelle
1

jq, 33 Zeichen

(30 Zeichen Code + 3 Zeichen Befehlszeilenoption)

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

Probelauf:

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

Probieren Sie es online aus!

Mann bei der Arbeit
quelle
3
Sie müssen keine Befehlszeilenflags mehr zählen.
AdmBorkBork
Hoppla. Gut zu wissen. Vielen Dank, dass Sie @AdmBorkBork.
Manatwork
1000->1e3
Shaggy
1

MediaWiki, 46 Bytes

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

Java 8, 78 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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
quelle