Unix timestamp ke string datetime

8

Diberi cap waktu unix sebagai input, berikan string datetime, dalam format seperti: "YYMMDD.HHmm"

Aturan

  • Input adalah angka (bilangan bulat) dari waktu UNIX yang tepat dalam milidetik (milidetik sejak 1970 1 Januari 00: 00: 00.000 UTC).
  • Nilai harus diisi dengan nol jika mereka adalah 1 karakter dan bukan 2. (mis: untuk "DD", "1" tidak dapat diterima, tetapi "01" adalah.)
  • Output harus berupa string tunggal. Tidak ada array.
  • Menangani lompatan kedua tidak masalah.
  • Kemenangan terpendek.

Semoga berhasil!

Contoh

Input: 1547233866744
Output: 190111.1911
skiilaa
sumber
2
Selamat datang di PPCG! Tantangan yang bagus, tetapi ada beberapa klarifikasi yang harus dibuat. Untuk membuat tantangannya mandiri, Anda mungkin harus menjelaskan apa zaman Unix itu. Selain itu, apa yang harus dilakukan dengan detik kabisat? Apa yang harus dilakukan dengan masalah Tahun 2038?
AdmBorkBork
1
@AdmBorkBork Mengedit posting untuk menjelaskan apa zaman Unix. Implementasi Leap second tidak masalah, karena string output tidak tepat kedua. Masalah Tahun 2038 saat ini tidak masalah karena itu bisa berupa keterbatasan perangkat yang sedang berjalan atau bahasa pemrograman yang dipilih.
skiilaa
1
Apakah zona waktu itu penting?
Erik the Outgolfer
Saya ambil tahun ini diwakili oleh angka dua digit?
Perwujudan Ketidaktahuan
1
@ Zona waktu FabianRöling tidak masalah.
skiilaa

Jawaban:

3

Japt v1.4.5 , 19 16 byte

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

1 byte disimpan berkat Oliver , yang menyebabkan 2 byte lainnya disimpan.

Cobalah


Penjelasan

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

Catatan / Tips

Shaggy
sumber
8

JavaScript (ES6), 65 byte

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

Cobalah online!

Bagaimana?

Kami menginisialisasi penunjuk i ke nilai non-numerik (dipaksakan ke 0 ) dan kemudian menambahkan secara bergantian 2 dan 1 untuk memilih karakter yang relevan dari konversi ISO-8601 dari timestamp input.

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

JavaScript (ES6), 66 byte

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

Cobalah online!

Bagaimana?

Setelah timestamp input dikonversi dalam format ISO-8601, semua karakter yang diperlukan dapat diakses dengan satu digit heksadesimal.

yyyy-mm-ddThh:mm:ss.sssZ
  ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
0123456789ABCDEF
Arnauld
sumber
Wow. Cuma wow.
skiilaa
1
64 byte:n=>'235689.11121415'.replace(/1?\w/g,x=>new Date(n).toJSON()[x])
tsh
@ tsh Bagus! Saya tidak mengharapkan format desimal menjadi lebih pendek. Anda mungkin ingin memposting ini sebagai jawaban terpisah.
Arnauld
7

PHP , 40 32 31 byte

-8 byte berkat Luis felipe
-1 byte terima kasih kepada Jo King

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

Cobalah online!

Jawaban naif sederhana. dateFungsi PHP mengambil string format dan cap waktu integer. Masukan dari argumen cli, yang merupakan string secara default, maka /1e3karena datemengharapkan cap waktu tepat kedua. Ini juga memaksa string ke nomor.

Skidsdev
sumber
Jawaban bagus!
Sedikit
32 byte Anda tidak perlu melakukan bilangan bulat karena "2"/1akan secara otomatis memasukkan string
Luis felipe De jesus Munoz
ah tentu saja, saya menambahkan intval sebelum menyadari bahwa saya perlu /1000, dan tidak berpikir bahwa saya mungkin tidak memerlukannya setelah itu: P
Skidsdev
@JoKing ah bagus, terima kasih
Skidsdev
5

MATL , 28 byte

Terima kasih kepada @skiilaa untuk koreksi dalam format output.

864e5/719529+'YYmmDD.HHMM'XO

Cobalah online!

Penjelasan

MATL, seperti MATLAB, mendefinisikan angka tanggal / waktu sebagai (mungkin bukan bilangan bulat) hari sejak waktu 00:00 dari "tanggal" referensi 0-Jan-0000.

Jadi kami mengambil input, membaginya dengan 86400000 (jumlah milidetik dalam satu hari), tambahkan 719529 (jumlah hari dari referensi MATL ke referensi UNIX), dan konversikan ke format yang diinginkan 'YYmmDD.HHMM'.

Luis Mendo
sumber
5

PowerShell , 59 58 byte

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

Cobalah online!

Mendapat Datedari 1/1/1970(default ke 00:00:00 pagi), lalu Adds jumlah yang sesuai Seconds. Mengirimnya ke -foperator ormat, yang memformat datetime dengan benar.

Mungkin tergantung budaya. Ini bekerja pada TIO, yaitu en-us.

-1 byte berkat shaggy.

AdmBorkBork
sumber
4

GNU AWK, 34 33 karakter

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

( strftime()adalah ekstensi GNU, tidak akan berjalan di implementasi AWK lainnya.)

Terimakasih untuk:

Sampler run:

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

Cobalah online!

manatwork
sumber
Terima kasih, Jojo. Sayangnya E-notasi bukan teman saya, jadi saya selalu lupa.
manatwork
3

Perl 6 ,  111 89  87 byte

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

Cobalah (111)

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

Cobalah (89)

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

Cobalah (87)

Penjelasan:

The oOperator infiks mengambil dua fungsi dan menciptakan fungsi komposit. Yang paling kanan dipanggil terlebih dahulu, dan yang ke kiri dipanggil dengan hasilnya.

Pada dasarnya kami menggunakan 4 blok lambdas untuk menghasilkan satu lambda.

Yang tidak jauh berbeda dengan bagaimana lambda LIKE ApapunCode * + *dibuat.


Bagilah dengan 1000 dan gunakan itu untuk membuat objek DateTime.

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

Hasilnya akan digunakan oleh:

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

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

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

Itu membuat kita seperti string 2019-01-11.19 11

Kami perlu menghapus dua digit pertama

{S/..//}

Kami juga perlu menghapus -dan

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

Python 2 , 64 byte

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

Cobalah online!

Masukan dianggap dalam UTC.

Erik the Outgolfer
sumber
1
Sama seperti sesuatu yang saya agak bingung, apakah satu-satunya alasan yang lambdadatang sebelum importkarena berfungsi lebih baik untuk header TIO?
Neil A.
2
@NeilA. Iya. Impor bisa masuk sebelum atau sesudah, isi lambda tidak diperiksa NameErrorsebelum disebut.
Erik the Outgolfer
3

R , 58 56 byte

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

Cobalah online!

menggali semua
sumber
3

C (gcc) (32-bit, little endian), 67 byte

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

Cobalah online!

Pada platform ILP64, versi 55 byte berikut ini akan berfungsi:

f(t,s){t/=1e3;strftime(s,12,"%y%m%d.%H%M",gmtime(&t));}
nwellnhof
sumber
Apa sargumen tambahan yang Anda ambil?
Shaggy
1
@ Shaggy sAdalah untuk string output.
nwellnhof
Sepertinya Anda menjalankannya di luar fungsi; apakah kita memiliki konsensus meta yang memungkinkan C untuk melakukan itu?
Shaggy
@ Shaggy Saya tidak yakin apa artinya "konsensus" tapi ini meta postingan yang relevan .
nwellnhof
Dengan "32-bit,", mengapa long longbukan longatau int32_t, int64_t, time_t? IAC, semua lebih pendek dari long long.
chux
2

Perl 6 , 57 50 byte

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

Cobalah online!

Mengambil pengetatan default Datetime, dalam format yyyy-mm-ddThh:mm:ssZdan memodifikasinya agar sesuai dengan format output. Perl 6 membutuhkan metode formatter tanggal.

Penjelasan:

                       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
sumber
2

C # (Visual C # Interactive Compiler) , 67 61 60 byte

n=>$"{new DateTime(1970,1,1).AddTicks(n*10000):yyMMdd.HHmm}"

Untuk alasan yang tidak saya ketahui, DateTime.UnixEpoch tidak berfungsi.

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1
Tampaknya UnixEpoch hanya hadir di. Net Core
2.1+
2

Javascript ES6, 76 66 byte

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

Cobalah online

-10 byte berkat 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
sumber
3
Anda mungkin ingin menunggu satu hari atau lebih sebelum menjawab pertanyaan Anda sendiri di lain waktu.
fəˈnɛtɪk
71 byte
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz, itu cukup berbeda untuk Anda kirim sendiri.
Shaggy
@LuisfelipeDejesusMunoz 66 byte untuk mengikat Anda dengan Arnauld.
Shaggy
2

C (dentang) , 117 111 byte

Terima kasih kepada @chux dan @ceilingcat untuk sarannya.

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

Cobalah online!

ErikF
sumber
gmtimelebih pendek darilocaltime
chux - Reinstate Monica
2

Ranting, 25 karakter

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

Ini adalah templat. Sebut dengan memasukkannya dan lulus waktu Unix sebagai parameter d.

Penggunaan sampel:

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

Cobalah di TwigFiddle

manatwork
sumber
1

jq, 33 karakter

(30 karakter kode + 3 opsi opsi baris perintah)

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

Contoh dijalankan:

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

Cobalah online!

manatwork
sumber
3
Anda tidak perlu lagi menghitung flag-command-line.
AdmBorkBork
Ups. Senang mendengarnya. @AdmBorkBork terima kasih.
manatwork
1000->1e3
Shaggy
1

MediaWiki, 46 byte

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

Java 8, 78 byte

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

Cobalah online.

Penjelasan:

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
sumber