Skip to content

Commit 6354760

Browse files
committed
Dateのtypo修正とJavaとの変換の追加
1 parent e412462 commit 6354760

File tree

5 files changed

+170
-24
lines changed

5 files changed

+170
-24
lines changed

docs/_sources/otherbuiltinobjects.rst.txt

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ TypeScriptの\ ``Date``\ 型は数字に毛の生えたようなものですの
271271
272272
UTCの時刻から生成したい場合には、\ ``Date.UTC()``\ 関数を使います。これはエポック秒を返すのでこれを\ ``new Date()``\ に渡すことで、UTC指定の時刻のインスタンスが作成できます。
273273

274+
.. code-block:: ts
275+
274276
// UTCの2020年9月21日11時10分5秒
275277
// 日本で実行すると日本時間20時(日本時間はUTCは9時間進んでいるように見える)に
276278
const d = new Date(Date.UTC(2020, 8, 21, 11, 10, 5))
@@ -387,7 +389,7 @@ Goでは日付のフォーマットが何種類か選べますが、このうち
387389
Pythonとの交換の場合
388390
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
389391

390-
Pythonで出力する場合は\ ``datetime.datetime.isoformat()``\ メソッドを使うと良いでしょう。このメソッドはタイムゾーン情報を取り払い、現在のタイムゾーンの表記そのものをフォーマットして出力します。TypeScriptの\ ``new Date()``\ はUTCであることを前提としてパースするため、出力時はUTCとして出すように心がける必要があります。このUTCで出色された文字列はTypeScriptでパースできます
392+
Pythonで出力する場合は\ ``datetime.datetime.isoformat()``\ メソッドを使うと良いでしょう。このメソッドはタイムゾーン情報を取り払い、現在のタイムゾーンの表記そのものをフォーマットして出力します。TypeScriptの\ ``new Date()``\ はUTCであることを前提としてパースするため、出力時はUTCとして出すように心がける必要があります。このUTCで出力された文字列はTypeScriptでパースできます
391393

392394
.. code-block:: python
393395
@@ -404,7 +406,7 @@ Pythonで出力する場合は\ ``datetime.datetime.isoformat()``\ メソッド
404406
utctime.isoformat()
405407
# 2020-09-21T13:42:58.279772+00:00
406408
407-
パースはやっかいです。Stack Overflowでスレッドが立つぐらいのネタです\ [#]_\ 。Python 3.7からは``fromisoformat()``\ というクラスメソッドが増えましたが、以前からの\ ``datetime.strptime()``\ にフォーマット指定を与えた方が高速とのことです。
409+
パースはやっかいです。Stack Overflowでスレッドが立つぐらいのネタです\ [#]_\ 。Python 3.7からは\ ``fromisoformat()``\ というクラスメソッドが増えましたが、以前からの\ ``datetime.strptime()``\ にフォーマット指定を与えた方が高速とのことです。
408410

409411
.. code-block:: python
410412
@@ -427,3 +429,51 @@ Pythonで出力する場合は\ ``datetime.datetime.isoformat()``\ メソッド
427429
# datetime.datetime(2020, 9, 21, 12, 38, 15, 655000, tzinfo=datetime.timezone.utc)
428430
429431
.. [#] https://stackoverflow.com/questions/127803/how-do-i-parse-an-iso-8601-formatted-date
432+
433+
Javaとの交換の場合(8以降)
434+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
435+
436+
Java8から標準になったクラス群\ [#]_\ を使ってTypeScriptとの交換を行ってみます。ここで紹介するコードはJava8以降で動作するはずです。このサンプルはJava 11で検証しています。
437+
438+
``Date.toISOString()``\ と同等の出力は\ ``DateTimeFormatter``\ で作成できます。UTCのゾーンになるようにインスタンスを作成してから\ ``format()``\ メソッドを使って変換します。
439+
440+
.. code-block:: java
441+
442+
import java.time.Instant;
443+
import java.time.ZonedDateTime;
444+
import java.time.ZoneId;
445+
import java.time.format.DateTimeFormatter;
446+
447+
class ParseTest {
448+
public static void main(String[ ] args) {
449+
var RFC3339_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
450+
451+
var l = ZonedDateTime.now();
452+
var isoString = l.withZoneSameInstant(ZoneOffset.UTC).format(RFC3339_FORMAT);
453+
System.out.println(isoString);
454+
// "2020-09-23T13:55:53.780Z"
455+
}
456+
}
457+
458+
この文字列はTypeScriptでパースできます。
459+
460+
TypeScriptで生成した文字列のパースには前述の\ ``DateTimeFormatter``\ も使えますが、それ以外には\ ``java.time.Instant``\ が使えます。これはある時点での時刻を表すクラスです。TypeScriptの\ ``Date.toISOString()``\ の出力する文字列をパースできます。実際に日時の操作を行う\ ``LocalDateTime``\ \ ``ZonedDateTime``\ へも、ここから変換できます。次のサンプルは\ ``Instant``\ でパースし、\ ``ZonedDateTime``\ に変換しています。
461+
462+
.. code-block:: java
463+
464+
import java.time.Instant;
465+
import java.time.ZonedDateTime;
466+
import java.time.ZoneId;
467+
import java.time.format.DateTimeFormatter;
468+
469+
class ParseTest {
470+
public static void main(String[ ] args) {
471+
var i = Instant.parse("2020-09-23T14:06:11.027Z");
472+
var l = ZonedDateTime.ofInstant(i, ZoneId.systemDefault());
473+
474+
var f = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
475+
System.out.println(l.format(f));
476+
}
477+
}
478+
479+
.. [#] `Java8の日時APIはとりあえずこれだけ覚えとけ <https://qiita.com/tag1216/items/91a471b33f383981bfaa>`_

0 commit comments

Comments
 (0)