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

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

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

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

Q&A

解決済

3回答

18647閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

1グッド

0クリップ

投稿2018/09/25 04:24

編集2018/09/27 07:14
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 を使ってやりたいことができました
お答えいただいた方々本当のありがとうございました

x_x👍を押しています

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

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

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

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

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

kei344

2018/09/25 04:29

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

2018/09/25 05:22

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

退会済みユーザー

2018/09/25 05:34

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

退会済みユーザー

2018/09/25 05:35

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

回答3

0

ベストアンサー

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 05:48

編集2018/09/25 08:36
spookybird

総合スコア1803

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

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

退会済みユーザー

退会済みユーザー

2018/09/25 06:16

真っ先にそれを使おうとしたんですが <script src="https://momentjs.com/downloads/moment-with-locales.js"></script> してから var moment = require('moment-timezone'); moment.tz.setDefault("Asia/Tokyo"); とやろうとしても ReferenceError: require is not defined というエラーが出て使えなかったので困ってます
spookybird

2018/09/25 06:50

require() などという関数はブラウザに存在しませんので、requireするならなんらかのバンドラでバンドルしてください。 webpack, browselify, parccel などがあります。 または、moment.js はブラウザ直接でも使えるようになっていますので、 https://momentjs.com/docs/#/use-it/browser/ ここを参考に使ってみてください。
退会済みユーザー

退会済みユーザー

2018/09/25 07:18

ありがとうございます 追記にかいたとおり moment を使って出力先はかえることができたんですが、やはり入力を任意のタイムゾーンにできなくて require するためだけにおおげさなライブラリをいれたくないのでもう少しデフォルトの JS の範囲内で実現できないか調べてみます
miyabi-sun

2018/09/25 08:02

違うのよ、コレ見て!! https://momentjs.com/docs/#/use-it/browser/ require関数依存のはNode.js版、 ブラウザにはrequireがないから、グローバル変数領域にmoment関数を作ってくれるバージョンがあってそっち読み込めって話ね。 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js"></script> みたいにすればグローバル変数領域にmomentが追加されて使える。 タイムゾーンの行き来はこっちの方見てね、 上のタグはCDNからmoment-with-locales.min.jsってのを落として使うようにしたからMoment.jsとMoment Timezone両方の機能が使えるはずだよ https://momentjs.com/timezone/
退会済みユーザー

退会済みユーザー

2018/09/25 08:18 編集

そこも先に読んでみましたがもともと <script src="https://momentjs.com/downloads/moment-with-locales.js"></script> でロケール版の方をブラウザでリンクしてテストしてて <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js"></script> におきかえてみましたがやはり moment.tz.setDefault("Asia/Tokyo"); cannot read property 'setDefault' of undefined というエラーになります moment() 自体は使えるんですが… 別の回答で >Dataオブジェクトを表示したときのタイムゾーンは、ブラウザのタイムゾーンが使われます。 とあるのでセキュリティの関係で勝手にタイムゾーンの変更ができるメソッドが用意されていないのかなと勝手に判断してました
退会済みユーザー

退会済みユーザー

2018/09/25 09:02

ありがとうございます moment-timezone-with-data というJSも必要だったのですね setDefault は通るようになりました
退会済みユーザー

退会済みユーザー

2018/09/26 01:35

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

0

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

投稿2018/09/25 05:26

yambejp

総合スコア114769

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

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

退会済みユーザー

退会済みユーザー

2018/09/25 09:55

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

0

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

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

で計算しました。

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

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

投稿2019/02/17 06:38

編集2019/02/17 06:42
abi-nitio

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問