Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

実行環境のタイムゾーンによって出力結果が変化する #56

Open
Seo-4d696b75 opened this issue Jan 5, 2023 · 1 comment

Comments

@Seo-4d696b75
Copy link

状況の再現方法

node_moduleとしてインストール

  • @holiday-jp/holiday_jp: 2.4.0
  • node: v14.19.3
// main.js
var holiday_jp = require("@holiday-jp/holiday_jp");

// "Asia/Tokyo"(+0900) 以外のタイムゾーンで実行すると結果が変化する場合がある
// process.env.TZ = "Asia/Tokyo";

// 元旦
var date = new Date("2022-01-01T00:00:00+0900");
console.log(date.toString());
console.log(holiday_jp.isHoliday(date)); // expected true;
console.log(holiday_jp.between(date, date)); // expected not-empty list
node main.js

codesandbox

実行結果

sandboxの設定やprocess.env.TZの値を変化させ異なるタイムゾーンで実行します

Asia/Tokyo +0900

予期した通りの結果が得られました

Sat Jan 01 2022 00:00:00 GMT+0900 (Japan Standard Time)
true
[
  {
    date: 2022-01-01T00:00:00.000Z,
    week: '',
    week_en: 'Saturday',
    name: '元日',
    name_en: "New Year's Day"
  }
]

UTC +0000

結果が変わります

Fri Dec 31 2021 15:00:00 GMT+0000 (Coordinated Universal Time)
false
[]

質問

こちらは意図した動作でしょうか?

"YYYY-MM-DD"の文字列表現に変換する関数format内部で、タイムゾーンに影響される関数 Date#get**をそのまま利用しているのが原因そうです。

var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + (date.getDate())).slice(-2);

@k1LoW
Copy link
Member

k1LoW commented Jan 6, 2023

結論としては意図した動作になります。

holiday-jp は YAMLの日付の文字列を使って祝日を管理しています。つまりタイムゾーンはありません。

また、ベースとなるライブラリは https://github.com/holiday-jp/holiday_jp-ruby です。こちらをみると to_date を使っています。

https://github.com/holiday-jp/holiday_jp-ruby/blob/ef8f0370b1119dca348f8dc19ec0a7154f500d26/lib/holiday_jp/holidays.rb#L21-L29

to_dateメソッドの挙動はタイムゾーンによって出力が変化します

$ irb
irb(main):001:0> require 'time'
=> true
irb(main):002:0> Time.new('2023', '01', '01').to_date
=> #<Date: 2023-01-01 ((2459946j,0s,0n),+0s,2299161j)>
irb(main):003:0> Time.new('2023', '01', '01').utc.to_date
=> #<Date: 2022-12-31 ((2459945j,0s,0n),+0s,2299161j)>
irb(main):004:0>

つまりタイムゾーンは関係なく日付の文字列だけで判定しています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants