Unixタイムスタンプから日時文字列


8

UNIXタイムスタンプを入力として、日時文字列を次のような形式で指定します: "YYMMDD.HHmm"

ルール

  • 入力は、ミリ秒精度のUNIXエポック時間(1970年1月1日00:00:00.000 UTCからのミリ秒)の数値(整数)です。
  • 2の代わりに1文字の場合、値にはゼロを埋め込む必要があります(例:「DD」の場合、「1」は受け入れられませんが、「01」は受け入れられません)。
  • 出力は単一の文字列でなければなりません。配列はありません。
  • うるう秒の処理は重要ではありません。
  • 最短の勝利。

幸運を!

Input: 1547233866744
Output: 190111.1911

2
PPCGへようこそ!いい挑戦ですが、いくつか説明が必要です。挑戦を自己完結型にするには、おそらくUnixエポックとは何かを説明する必要があります。さらに、うるう秒で何をすべきですか?2038年問題で何をすべきですか?
AdmBorkBork

1
@AdmBorkBork投稿を編集して、Unixエポックとは何かを説明しました。出力文字列は秒精度ではないため、うるう秒の実装は重要ではありません。2038年問題は、実行中のデバイスまたは選択したプログラミング言語の制限である可能性があるため、現時点では問題になりません。
skiilaa

1
タイムゾーンは重要ですか?
Erik the Outgolfer

年は2桁の数字で表されると思いますか?
無視の

1
@FabianRölingのタイムゾーンは関係ありません。
skiilaa

回答:


3

JAPT v1.4.519の 16バイト

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

Oliverのおかげで1バイトが節約され、さらに2バイト節約されました。

それを試してみてください


説明

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

注意事項/ヒント


8

JavaScript(ES6)、65バイト

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

オンラインでお試しください!

どうやって?

ポインターを非数値(0強制される)に初期化し、21を交互に追加して、入力タイムスタンプのISO-8601変換から関連する文字を選択します。

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

JavaScript(ES6)、66バイト

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

オンラインでお試しください!

どうやって?

入力タイムスタンプがISO-8601形式に変換されると、必要なすべての文字に単一の16進数でアクセスできます。

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

ワオ。ただ、すごい。
skiilaa

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

@tshいいね!10進数形式が短くなるとは思っていませんでした。これを別の回答として投稿することもできます。
Arnauld


7

PHP40 32 31バイト

-8バイト、Luis felipeのおかげで、
-1バイト、Jo Kingのおかげで

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

オンラインでお試しください!

単純な素朴な答え。PHPのdate関数は、フォーマット文字列と整数のタイムスタンプを受け取ります。デフォルトでは文字列であるcli引数からの入力。これは、2番目に正確なタイムスタンプを期待する/1e3ためdateです。これも文字列を数値に強制します。


いい答えだ!言語に日付形式がある場合は少し短くなります、はい:)
skiilaa

"2"/1文字列を自動的にキャストするため、32バイトを整数にキャストする必要はありません
Luis felipe De jesus Munoz

もちろん、必要/1000だと気づく前にintvalを追加しましたが、後で必要になるとは思わなかった:P
Skidsdev

@JoKingああ、ありがとう
1

5

MATL、28バイト

出力形式の修正について@skiilaaに感謝します。

864e5/719529+'YYmmDD.HHMM'XO

オンラインでお試しください!

説明

MATLは、MATLABと同様に、参照 "date" 0-Jan-0000の時刻00:00からの(おそらく非整数の)日数として日付/時刻番号を定義します。

したがって、入力を受け取り、それを86400000(1日のミリ秒数)で除算し、719529(MATLの参照からUNIX参照までの日数)を加算し、目的の形式 'YYmmDD.HHMM'に変換します。


5

PowerShell59 58バイト

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

オンラインでお試しください!

取得Date1/1/1970(夜十二時00分00秒午前デフォルト)は、その後、Add適切な数のよSeconds。それを-f日付を正しくフォーマットするormat演算子に渡します。

おそらく文化に依存します。これはTIOで機能しen-usます。

シャギーのおかげで-1バイト。


4

GNU AWK、34 33文字

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

strftime()GNU拡張であり、他のAWK実装では実行されません。)

おかげで:

サンプラーの実行:

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

オンラインでお試しください!


ありがとう、@ JoKing。残念ながらE-notationは本当に私の友達ではないので、いつも忘れてしまいます。
manatwork

3

Perlの6 111の89  87バイト

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

やってみよう(111)

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

試す(89)

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

やってみる(87)

説明:

o中置演算子は、2つの機能を取り、複合関数を作成します。右端のものが最初に呼び出され、左のものが最初に呼び出され、その結果が返されます。

基本的に、4つのブロックラムダを使用して単一のラムダを生成します。

これは、WhateverCodeラムダのようなもの* + *が作成される方法と大差ありません。


1000で割り、それを使用してDateTimeオブジェクトを作成します。

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

結果は以下によって使用されます:

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

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

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

それは私たちのような文字列を残します 2019-01-11.19 11

最初の2桁を削除する必要があります

{S/..//}

また、削除-して

{TR/- //}

3

Python 2、64バイト

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

オンラインでお試しください!

入力はUTCであると見なされます。


1
私が少し混乱しているのと同じように、TIOのヘッダーにうまく機能lambdaするimportため、が前に来る唯一の理由は何ですか?
Neil A.

2
@NeilA。はい。インポートは前または後のいずれかに進むことができ、ラムダの内容は、NameError呼び出される前にs がチェックされません。
Erik the Outgolfer


3

C(gcc)(32ビット、リトルエンディアン)、67バイト

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

オンラインでお試しください!

ILP64プラットフォームでは、次の55バイトバージョンが機能します。

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

sあなたがとっている余分な議論は何ですか?
Shaggy

1
@Shaggyこれsは出力文字列用です。
nwellnhof

関数の外で開始しているようです。Cがそれを可能にするメタコンセンサスはありますか?
Shaggy

@Shaggy「コンセンサス」が正確に何を意味するのかわかりませんが、関連するメタ投稿があります。
nwellnhof

「32ビット」と、理由long longの代わりに、longまたはint32_tint64_ttime_t?IAC、すべて未満long long
chux-モニカを

2

Perl 6の57の 50バイト

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

オンラインでお試しください!

日時のデフォルトの文字列化を次の形式で受け取ります yyyy-mm-ddThh:mm:ssZで取得し、出力フォーマットに適合するように変更します。Perl 6は日付フォーマッターメソッドを必要としています。

説明:

                       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バイト

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

オンラインでお試しください

シャギーのおかげで-10バイト!


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
次回は自分の質問に答える前に1日ほど待つことをお勧めします。
fəˈnɛtɪk



1
@LuisfelipeDejesusMunoz、それはあなたが自分で投稿するのに十分な違いです。
Shaggy

@LuisfelipeDejesusMunoz 66バイトでArnauldとつながります。
Shaggy


2

小枝、25文字

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

これはテンプレートです。それをインクルードして呼び出し、Unix時間をパラメーターdとして渡します。

使用例:

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

TwigFiddleでお試しください



1

jq、33文字

(30文字のコード+ 3文字のコマンドラインオプション)

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

サンプルの実行:

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

オンラインでお試しください!


3
あなたはカウントする必要はありませんもう、コマンドラインフラグを。
AdmBorkBork

おっとっと。知ってよかった。@AdmBorkBorkありがとうございます。
manatwork

1000->1e3
Shaggy


1

MediaWiki、46バイト

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

1

Java 8、78バイト

n->new java.text.SimpleDateFormat("yyMMdd.HHmm").format(new java.util.Date(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.