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

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


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

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.


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'.


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.


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!


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

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.


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

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

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 '-'


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

3
Anda mungkin ingin menunggu satu hari atau lebih sebelum menjawab pertanyaan Anda sendiri di lain waktu.
fəˈnɛtɪk



1
@LuisfelipeDejesusMunoz, itu cukup berbeda untuk Anda kirim sendiri.
Shaggy

@LuisfelipeDejesusMunoz 66 byte untuk mengikat Anda dengan Arnauld.
Shaggy


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





1

MediaWiki, 46 byte

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.