質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

4793閲覧

ISO形式の時刻(UTC)をISO形式の日本時刻に変換するには?

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/09/13 01:42

時刻周りの用語を正しく使えているか正直自信はないのですが、ISO形式の時刻(UTC)をISO形式の日本時刻に変換するには、単純に9時間を足してあげれば良いだけの話なのでしょうか?

文字列「2014-10-10T04:50:40Z」

文字列「2014-10-10T13:50:40+09:00」

上の文字列を下の文字列に変換したいのですが、この為のJavaScirptのメソッドというのは存在するのでしょうか?
一応、調べてはみたのですが、やはり、ライブラリを使うことになるか、もしくは、上の文字列を一度、UTCの数値に変換して、日本時刻のISO形式文字列を取得するような流れになるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

おおむねその認識であっています。

今はある程度対応してるかな……と思ったらそうでもなさそうなので、一番はMoment.jsを使うのがよさそうですね。

Moment.js


P.S. (および参考資料)

JavaScript、まだ罠が多いんだな……。

投稿2017/09/13 02:05

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/13 02:10

そうですね。素直に日時周りはMoment.jsに任せるのが良いですよね。
miyabi-sun

2017/09/13 06:58

これ。 年と日がそのまま(1〜31)なのに月が0〜11のDateをそのまま使うなんて正気の沙汰じゃない。 入ってるプロジェクトで日付を扱う場合全部moment.js入れてるね。
guest

0

toLocaleString()でローカル時間を取得して
getTimezoneOffset()で得たオフセット分を利用して表示するのが妥当です

sample

どうしても文字列処理が入るのできたないですね
そういう意味でライブラリの利用が推奨されます

javascript

1var str="2014-10-10T04:50:40Z"; 2var d=new Date(str); 3var d2=new Date('1970-01-01 0:00:00'); 4d2.setMinutes(-d.getTimezoneOffset()); 5console.log(d.toLocaleString().replace(/\/(\d)(?!\d)/g,"/0$1").replace(/\//g,"-").replace(/\x20/g,"T").replace(/T(\d):/,"T0$1:")+"+"+d2.toLocaleString().replace(/^.+?\x20(\d{1,2}:\d+).+$/,"$1").replace(/^(.{4})$/,"0$1"));

普通な処理

javascript

1Date.prototype.getMyString=function(){ 2 var str=""; 3 str+=this.getFullYear(); 4 str+="-"; 5 str+=(this.getMonth()+101).toString().substr(-2); 6 str+="-"; 7 str+=(this.getDate()+100).toString().substr(-2); 8 str+="T"; 9 str+=(this.getHours()+100).toString().substr(-2); 10 str+=":"; 11 str+=(this.getMinutes()+100).toString().substr(-2); 12 str+=":"; 13 str+=(this.getSeconds()+100).toString().substr(-2); 14 str+="+"; 15 str+=(Math.floor(-(this.getTimezoneOffset()/60)+100)).toString().substr(-2); 16 str+=":"; 17 str+=(Math.floor(-(this.getTimezoneOffset()%60)+100)).toString().substr(-2); 18 return str; 19} 20var d=new Date("2014-10-10T04:50:40Z"); 21console.log(d.getMyString());

投稿2017/09/13 01:57

編集2017/09/13 09:06
yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/13 02:01

一旦、Dateオブジェクトを文字列から生成しなおして、日本時刻の文字列を取得するという流れですか? new Date('2014-10-10T04:50:40Z').toLocaleString()
退会済みユーザー

退会済みユーザー

2017/09/13 02:02

ちなみに、toLocalString()を実行した時点で既に時差が加算された時刻が取得できていますが、そこから、さらにgetTimezoneOffset()を使うのは、どういった理由からなのですか?
yambejp

2017/09/13 02:08

var d=new Date("2014-10-10T04:50:40Z"); としたところで d.toLocaleString().replace(/\//g,"-") で得られるのが 2014-10-10 13:50:40 ですので、最後の「+09:00」を得るために getTimezoneOffset() から540分(マイナス)をえて60でわって「9」を得て下さい ・・・という意味です。 日本限定ということであれば最初から「+09:00」と文字列で書いても問題ありません
退会済みユーザー

退会済みユーザー

2017/09/13 02:10

補足説明ありがとうございます。
yambejp

2017/09/13 03:00

ざっくりテストしてみたのでsampleつけておきました あまりきれいじゃないですね
think49

2017/09/13 08:59

Date#toLocaleString() は「現在のロケール」に対応した日付文字列を出力しますが、そこが日本ではなかった場合に YYYY/MM/DD HH:mm:nn 形式で返すことが期待できなくなり、機能しなくなってしまう問題があります。 ロケールを日本に設定した端末からのみアクセスするサイトである事が保証する必要があるという点で、汎用性を捨てた設計になってしまっていると思います。 また、私はまだ仕様を追い切れていないのですが、仮に上の前提がクリアされたとしても、日本のロケールの場合に "YYYY/MM/DD HH:mm:nn" を返すことが保証されている必要があるので、仕様を追いかけないと日本のロケールだとしてもやや不安です。 http://www.ecma-international.org/ecma-262/8.0/#sec-date.prototype.tolocalestring http://ecma-international.org/ecma-402/1.0/#sec-13.3.1
yambejp

2017/09/13 09:05

think49さん、ご指摘ありがとうございます まぁそもそも無理のある処理でした。 いまさら書いても仕方ないですが普通の処理を追記しときました。
guest

0

ISO 8601 拡張形式

...この為のJavaScirptのメソッドというのは存在するのでしょうか?

少なくとも、ES2017にネイティブ関数はなく、自分で実装するしかなさそうなので、作ってみました。

JavaScript

1console.log(toISOLocalString(new Date('2014-10-10T04:50:40Z'))); // "2014-10-10T13:50:40.000+09:00"

単純に9時間を足してあげれば良いだけの話なのでしょうか?

そういう考え方もありますが、getFullYear, getMonth, getDate...etc は、現在のロケールに対応した数値を返す仕様なので、一度、date オブジェクトに変換すれば、楽に出力できると思います。

省略記法

文字列「2014-10-10T13:50:40+09:00」

ミリ秒が省略されているようですが、省略形式にする場合は、String#replace で置換するか、コードを書き換えるかして下さい。
new Date に投げる形式をとるなら、現行仕様で問題はないはずです。

日本時刻に変換する目的

文字列「2014-10-10T04:50:40Z」

文字列「2014-10-10T13:50:40+09:00」

どちらも、new Date に投げれば、同じ日付オブジェクトになるので、通常利用ではどちらでも問題がありません。
「どういう目的で変換したいのか」は明らかにすると、別の切り口から解決手段が見えてくるかもしれません。

JavaScript

1console.log(new Date('2014-10-10T04:50:40Z')); // Fri Oct 10 2014 13:50:40 GMT+0900 (東京 (標準時)) 2console.log(new Date('2014-10-10T13:50:40+09:00')); // Fri Oct 10 2014 13:50:40 GMT+0900 (東京 (標準時))

Re: hayatomo さん

投稿2017/09/13 08:33

編集2017/09/13 16:50
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2017/09/13 08:42

コードを書いている間のクローズされてしまいました。 「ISO 8601 拡張形式」はそれほど難しい書式ではない為、自分で実装を試みるのは悪くない手だと個人的には思います。 new Date がパーサとして機能する為、ISO 8601拡張形式を使うのであれば、「日付文字列 <-> 日付オブジェクト」の相互変換は容易です。
kei344

2017/09/13 16:43

ES3017 ←誤字では。
think49

2017/09/13 16:58

kei344さん、ご指摘ありがとうございます。 修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問