Dấu thời gian Unix đến chuỗi thời gian


8

Đưa ra dấu thời gian unix làm đầu vào, đưa ra chuỗi thời gian, theo định dạng như sau: "YYMMDD.HHmm"

Quy tắc

  • Đầu vào là một số (số nguyên) của thời gian kỷ nguyên UNIX chính xác một phần nghìn giây (mili giây kể từ 1970 ngày 1 tháng 1 00: 00: 00.000 UTC).
  • Các giá trị phải được đệm bằng 0 nếu chúng là 1 ký tự thay vì 2. (ví dụ: đối với "DD", "1" không được chấp nhận, nhưng "01" là.)
  • Đầu ra phải là một chuỗi đơn. Không có mảng.
  • Bước nhảy vọt thứ hai không thành vấn đề.
  • Chiến thắng ngắn nhất.

Chúc may mắn!

Thí dụ

Input: 1547233866744
Output: 190111.1911

2
Chào mừng đến với PPCG! Thử thách đẹp, nhưng có một vài điều cần làm rõ. Để thực hiện thử thách khép kín, có lẽ bạn nên giải thích kỷ nguyên Unix là gì. Ngoài ra, những gì nên được thực hiện với giây nhuận? Nên làm gì với vấn đề Năm 2038?
admBorkBork

1
@AdmBorkBork Đã chỉnh sửa bài đăng để giải thích kỷ nguyên Unix là gì. Bước thực hiện thứ hai không thành vấn đề, vì chuỗi đầu ra không chính xác thứ hai. Vấn đề năm 2038 hiện tại không thành vấn đề vì nó có thể là một hạn chế của thiết bị đang chạy hoặc ngôn ngữ lập trình đã chọn.
Skiilaa

1
Liệu múi giờ có vấn đề?
Erik the Outgolfer

Tôi lấy nó năm được đại diện bởi một số có hai chữ số?
Hiện thân của sự thiếu hiểu biết

1
@ FabianRöling múi giờ không quan trọng.
Skiilaa

Câu trả lời:


3

Japt v1.4.5 , 19 16 byte

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

Lưu 1 byte nhờ Oliver , dẫn đến lưu 2 byte khác.

Thử nó


Giải trình

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

Ghi chú / Mẹo


8

JavaScript (ES6), 65 byte

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

Hãy thử trực tuyến!

Làm sao?

Chúng tôi khởi tạo con trỏ Tôi thành một giá trị không phải là số (được ép thành 0 ) và sau đó thêm xen kẽ 21 vào nó để chọn các ký tự có liên quan từ chuyển đổi ISO-8601 của dấu thời gian đầu vào.

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

JavaScript (ES6), 66 byte

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

Hãy thử trực tuyến!

Làm sao?

Khi dấu thời gian đầu vào được chuyển đổi ở định dạng ISO-8601, tất cả các ký tự được yêu cầu có thể được truy cập bằng một chữ số thập lục phân duy nhất.

yyyy-mm-ddThh:mm:ss.sssZ
  ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
0123456789ABCDEF

Ồ Chỉ là, wow.
Skiilaa

1
64 byte:n=>'235689.11121415'.replace(/1?\w/g,x=>new Date(n).toJSON()[x])
tsh

@tsh Đẹp quá! Tôi không mong đợi định dạng thập phân sẽ ngắn hơn. Bạn có thể muốn đăng bài này như một câu trả lời riêng biệt.
Arnauld


7

PHP , 40 32 31 byte

-8 byte nhờ Luis felipe
-1 byte nhờ Jo King

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

Hãy thử trực tuyến!

Câu trả lời đơn giản ngây thơ. dateHàm của PHP có một chuỗi định dạng và dấu thời gian nguyên. Nhập từ các đối số cli, là một chuỗi theo mặc định, sau đó /1e3datemong đợi dấu thời gian chính xác thứ hai. Điều này cũng ép buộc chuỗi thành một số.


Câu trả lời tốt đẹp! Sẽ ngắn hơn một chút nếu ngôn ngữ có định dạng ngày, vâng :)
Skiilaa

32 byte bạn không cần truyền thành số nguyên vì "2"/1sẽ tự động truyền chuỗi
Luis felipe De jesus Munoz

Tất nhiên, tôi đã thêm intval trước khi nhận ra mình cần /1000và không nghĩ rằng tôi không cần nó sau đó: P
Skidsdev

@JoKing ah một người tốt, cảm ơn
Skidsdev

5

MATL , 28 byte

Cảm ơn @skiilaa đã điều chỉnh định dạng đầu ra.

864e5/719529+'YYmmDD.HHMM'XO

Hãy thử trực tuyến!

Giải trình

MATL, giống như MATLAB, định nghĩa các số ngày / giờ là số ngày (có thể không phải là số nguyên) kể từ thời điểm 00:00 của "ngày" tham chiếu 0-Jan-0000.

Do đó, chúng tôi lấy đầu vào, chia cho 86400000 (số mili giây trong một ngày), thêm 719529 (số ngày từ tham chiếu của MATL sang tham chiếu UNIX) và chuyển đổi sang định dạng mong muốn 'YYmmDD.HHMM'.


5

PowerShell , 59 58 byte

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

Hãy thử trực tuyến!

Nhận được Datecủa 1/1/1970(mặc định là 12:00:00), sau đó Addlà số lượng thích hợp Seconds. Truyền nó cho -ftoán tử ormat, định dạng chính xác datetime.

Có lẽ phụ thuộc vào văn hóa. Điều này hoạt động trên TIO, đó là en-us.

-1 byte nhờ sự xù xì.


4

GNU AWK, 34 33 ký tự

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

( strftime()là phần mở rộng GNU, sẽ không chạy trong các triển khai AWK khác.)

Nhờ vào:

Chạy mẫu:

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

Hãy thử trực tuyến!


Cảm ơn bạn, @JoKing. Thật không may, ký hiệu điện tử không thực sự là bạn của tôi nên tôi luôn quên nó.
thao tác

3

Perl 6 ,  111 89  87 byte

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

Hãy thử nó (111)

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

Hãy thử nó (89)

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

Hãy thử nó (87)

Giải trình:

Các onhà điều hành ghi nhận hai chức năng và tạo ra một hàm composite. Người ngoài cùng bên phải được gọi đầu tiên, và người bên trái được gọi với kết quả của nó.

Về cơ bản chúng tôi sử dụng lambdas 4 khối để tạo ra một lambda duy nhất.

Điều này không khác nhiều so với cách mà lambda giống như * + *được tạo ra.


Chia cho 1000 và sử dụng số đó để tạo đối tượng DateTime.

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

Kết quả được sử dụng bởi:

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

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

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

Điều đó để lại cho chúng ta một chuỗi như 2019-01-11.19 11

Chúng ta cần loại bỏ hai chữ số đầu tiên

{S/..//}

Chúng ta cũng cần phải loại bỏ -

{TR/- //}

3

Python 2 , 64 byte

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

Hãy thử trực tuyến!

Đầu vào được coi là trong UTC.


1
Cũng giống như điều gì đó tôi đã hơi bối rối, có phải là lý do duy nhất lambdaxuất hiện trước importvì nó hoạt động tốt hơn cho tiêu đề của TIO?
Neil A.

2
@NeilA. Đúng. Việc nhập có thể đi trước hoặc sau, nội dung của lambda không được kiểm tra NameErrortrước khi nó được gọi.
Erik the Outgolfer


3

C (gcc) (32 bit, endian nhỏ), 67 byte

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

Hãy thử trực tuyến!

Trên nền tảng ILP64, phiên bản 55 byte sau sẽ hoạt động:

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

Bạn đang stranh luận thêm điều gì?
Xù xì

1
@Shaggy Dành scho chuỗi đầu ra.
nwellnhof

Có vẻ như bạn đang khởi tạo nó bên ngoài chức năng; chúng ta có một sự đồng thuận meta cho phép C làm điều đó không?
Xù xì

@Shaggy Tôi không chắc chính xác "đồng thuận" nghĩa là gì nhưng đây là bài đăng meta có liên quan .
nwellnhof

Với "32-bit", tại sao long longthay vì longhay int32_t, int64_t, time_t? IAC, tất cả đều ngắn hơn long long.
chux - Phục hồi Monica

2

Perl 6 , 57 50 byte

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

Hãy thử trực tuyến!

Lấy chuỗi theo mặc định của Ngày tháng, theo định dạng yyyy-mm-ddThh:mm:ssZvà sửa đổi nó để phù hợp với định dạng đầu ra. Perl 6 là cần một phương pháp định dạng ngày.

Giải trình:

                       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'?'.':'')

Dùng thử trực tuyến

-10 byte nhờ 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
Bạn có thể muốn đợi một ngày hoặc lâu hơn trước khi trả lời câu hỏi của riêng bạn vào lần tới.
fnɛtɪk



1
@LuisfelipeDejesusMunoz, đủ khác để bạn tự đăng bài.
Xù xì

@LuisfelipeDejesusMunoz 66 byte để ràng buộc bạn với Arnauld.
Xù xì


2

Cành, 25 ký tự

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

Đây là một mẫu. Gọi nó bằng cách bao gồm nó và vượt qua thời gian Unix là tham số d.

Sử dụng mẫu:

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

Dùng thử trên 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))

Hãy thử trực tuyến.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.