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

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

ただいまの
回答率

91.77%

  • JavaScript

    10060questions

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

  • Node.js

    1080questions

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

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

解決済

回答 3

投稿 2017/09/13 10:42

  • 評価
  • クリップ 0
  • VIEW 118

hayatomo

score 627

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+6

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

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

Moment.js


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

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

投稿 2017/09/13 11:05

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/09/13 11:10

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

    キャンセル

  • 2017/09/13 15:58

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

    キャンセル

+6

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

 sample

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

var str="2014-10-10T04:50:40Z";
var d=new Date(str);
var d2=new Date('1970-01-01 0:00:00');
d2.setMinutes(-d.getTimezoneOffset());
console.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"));

 普通な処理

Date.prototype.getMyString=function(){
  var str="";
  str+=this.getFullYear();
  str+="-";
  str+=(this.getMonth()+101).toString().substr(-2);
  str+="-";
  str+=(this.getDate()+100).toString().substr(-2);
  str+="T";
  str+=(this.getHours()+100).toString().substr(-2);
  str+=":";
  str+=(this.getMinutes()+100).toString().substr(-2);
  str+=":";
  str+=(this.getSeconds()+100).toString().substr(-2);
  str+="+";
  str+=(Math.floor(-(this.getTimezoneOffset()/60)+100)).toString().substr(-2);
  str+=":";
  str+=(Math.floor(-(this.getTimezoneOffset()%60)+100)).toString().substr(-2);
  return str;
}
var d=new Date("2014-10-10T04:50:40Z");
console.log(d.getMyString());

投稿 2017/09/13 10:57

編集 2017/09/13 18:06

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/09/13 11:01

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

    キャンセル

  • 2017/09/13 11:02

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

    キャンセル

  • 2017/09/13 11: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 11:10

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

    キャンセル

  • 2017/09/13 12:00

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

    キャンセル

  • 2017/09/13 17: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

    キャンセル

  • 2017/09/13 18:05

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

    キャンセル

+1

 ISO 8601 拡張形式

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

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

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

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

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

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

Re: hayatomo さん

投稿 2017/09/13 17:33

編集 2017/09/14 01:50

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/09/13 17:42

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

    キャンセル

  • 2017/09/14 01:43

    ES3017 ←誤字では。

    キャンセル

  • 2017/09/14 01:58

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

    キャンセル

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

ただいまの回答率

91.77%

関連した質問

同じタグがついた質問を見る

  • JavaScript

    10060questions

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

  • Node.js

    1080questions

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