エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

言語によって曜日を現す数値の実装はバラバラだった

f:id:tansantktk:20211119211723p:plain

タイトルの通りです。 各プログラミング言語の曜日を現す数値を調べてみたところ、見事に統一されておらず「何でだよ!」と言いたくなった、そんな記事です。

テーブルの曜日カラムの保持の仕方に迷った

発端は曜日カラムを用意する必要があり、数値型にすべきか文字列型にすべきか…で迷ったことでした。 大抵の言語には曜日を現す数値の取得方法が実装されているので、数値にしようかと安易に考えていたのですが、調べてみると言語によってかなりのバラつきがあることが発覚しました。

言語別 曜日数値の実装

ISO8601 Ruby C JavaScript C# Python PostgreSQL mysql
1 1 1 1 1 0 0 2
2 2 2 2 2 1 1 3
3 3 3 3 3 2 2 4
4 4 4 4 4 3 3 5
5 5 5 5 5 4 4 6
6 6 6 6 6 5 5 7
7 7 0 0 0 6 6 1

国際規格であるISO8601でも曜日に対して数値の割り当てがある為、併せて掲載しています。 言語に偏りがあるのはご容赦ください。

言語別 数値取得メソッド、列挙型

なお各言語は下記の実装より曜日数値が取得できます。

Ruby C JavaScript C# Python PostgreSQL mysql
Date#cwday tm_wday Date.prototype.getDay() DateTime.DayOfWeek date.weekday() dow() DAYOFWEEK()

最終的にどうしたか

PostgreSQLに曜日情報を保持し、C#SQLを実行して色々とバックエンドの処理をする予定だった為、'sun', 'mon', ... といった曜日文字列で保持することにしました。 数値にしろ文字列にしろ結局各言語環境でコンバートが必要になりますし、開発者が混乱する可能性もあった為、誰が見ても正確に曜日が判断できる文字列を採用しました。

この辺り良い感じの基準があるものだと思ってたんですが…🤤

参考

ISO 8601 - Wikipedia

datetime --- 基本的な日付型および時間型 — Python 3.10.0b2 ドキュメント

DayOfWeek 列挙型 (System) | Microsoft Docs

Date.prototype.getDay() - JavaScript | MDN

Date#cwday (Ruby 3.0.0 リファレンスマニュアル)

https://www.postgresql.jp/document/7.2/user/functions-datetime.html

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数