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

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

ただいまの
回答率

90.04%

Date のタイムゾーンについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,809
退会済みユーザー

退会済みユーザー

var time = new Date('2018-09-25 12:00:00');
console.log(time); // Tue Sep 25 2018 12:00:00 GMT+0900 (日本標準時)


となるんですが
Date が見ているタイムゾーンはどこで設定されてるんでしょうか

表示、パース時に文字列にTZ情報がないときデフォルトで
JST UTC 以外のタイムゾーンに設定することはできますか?

たとえば

var time = new Date('2018-09-25 12:00:00');
console.log(time); // Tue Sep 25 2018 12:00:00 (GMT-10:00) Hawaii

var time = new Date('2018-09-25 12:00:00 JST');
console.log(time); // Tue Sep 24 2018 17:00:00 (GMT-10:00) Hawaii


となるようにしたいです

あと設定ではなく明示的にTZを与えてそのTZ時刻を出力するにはどうすればいいんでしょうか

var time = new Date('2018-09-25 12:00:00 JST');
time.toTZformat('UTC'); #Tue Sep 25 2018 3:00:00 UTC

みたいにタイムゾーン文字列と Date オブジェクトからそのタイムゾーン時刻の出力を得たいです

追記:

moment のおかげで
moment('2018-09-25 12:00:00').utcOffset(...).format() とすれば
任意のタイムゾーンで出力することはできるようになったんですが

タイムゾーン情報のない時刻文字列を特定のタイムゾーンとして読み込むことができなくて困ってます
var moment = require('moment-timezone');
moment.tz.setDefault("Asia/Tokyo");
あたりを使えばできるきがするんですが自分の環境では require が undefined になってしまうので
JSの範囲内ではできないでしょうか

例えばハワイ時間 -1000 として 2018-09-25 12:00:00 を読み込んで
moment('2018-09-25 12:00:00').utcOffset('540').format();
とやったときに日本時間 +900 で 19時間後の 9/26 7:00 という時刻になってほしいです

追記:

結局いろいろ試した結果最初に回答をいただいたとおり offset 加減することにしました

javascript 単体で見れば moment を使ったほうがきれいにかける気がするのですが

たとえばハワイのタイムゾーンの場合 Rails 側から渡せる timezone の情報が
(GMT-10:00) Hawaii
Hawaii
Pacific - Honolulu
-36000
の4つの文字列しかなく最初の3つを setDefault にいれても変わらなかったので
結局オフセットで加減するなら moment じゃなくても Date でいいかなと

const date = new Date('2018-09-25 12:00:00');
date.setTime(date.getTime() - date.getTimezoneOffset() + <%= Time.zone.utc_offset %>);// localに変換


という感じです

setDefault の引数のオフセットがとれればよかったのですが…

フレームワーク間のタイムゾーンの表現の差はいかんともできないので
もしうまく Rails の Time.zone からmoment-timezone の setDefault にわたせる方法があれば教えていただきたいです

追記:

別の質問で Rails 側から 地域/都市 形式のタイムゾーン文字列を取得する方法を教えていただいたので moment を使ってやりたいことができました
お答えいただいた方々本当のありがとうございました

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2018/09/25 13:29

    具体的にどのタイムゾーンの出力結果が欲しいのでしょうか。

    キャンセル

  • m.ts10806

    2018/09/25 14:22

    タグにある情報はタイトルに含めなくても良いかと思います。「JavaScript」は長いですし、その分要件記載に当てられた方が質問の質も上がります

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/09/25 14:34

    >kei344さん ユーザごとに好きなタイムゾーンを設定できるようにしたいので文字列で与えたタイムゾーンに変更したいです。具体的には Rails の time_zone_select メソッドで選択できるタイムゾーンリスト

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/09/25 14:35

    >mts10806さん わかりました タイトル修正しました

    キャンセル

回答 3

checkベストアンサー

+4

JavaScriptで日付を扱うとどうしても面倒な記述が増えがちなので、手っ取り早くライブラリを使っちゃうのをお勧めします。
Moment.jsこれとかわりと有名なやつです。

Dateオブジェクトを表示したときのタイムゾーンは、ブラウザのタイムゾーンが使われます。
JavaScript Date Objects

By default, JavaScript will use the browser's time zone and display a date as a full text string

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/25 17:36

    https://jsfiddle.net/egnswc4d/
    こういうことですかね。

    キャンセル

  • 2018/09/25 18:02

    ありがとうございます
    moment-timezone-with-data
    というJSも必要だったのですね

    setDefault は通るようになりました

    キャンセル

  • 2018/09/26 10:35

    Rails側でmomentのsetDefaultに渡せる形式のTZが取得できたのでmomentのsetDefaultを使っていけそうです
    ありがとうございました!

    キャンセル

+4

getTimezoneOffset()はありますがsetTimezoneOffset()がないので
タイムゾーンの調整は難しそうです。
dateオブジェクトに対してダイレクトに時間を足し引きして処理するのが妥当でしょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/25 18:55

    回答ありがとうございました
    いろいろ回り道した結果やはりそれが一番近道な気がしました

    キャンセル

0

hoursのみの算出になりますが、

(new Date().getHours() + 9 - new Date().getTimezoneOffset() / 60)

で計算しました。

面倒ですが、これで取得した時間を用いて、

new Date(year, month, day, hours, minutes) の中に、値を入れてあげるといいのではないかと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる