プログラミングで「午後10時に3時間を足すと1日と2時間」になる問題がついに解決へ!
■ このスレッドは過去ログ倉庫に格納されています
https://www.infoq.com/jp/news/2021/05/Net6-Date-Time/
.NETの基本クラスライブラリの長年の問題は、日付と時刻の値を別々に表すことができない
ことである。.NET 6の一部として、新しいDateOnlyクラスとTimeOnlyクラスは、この過失を
修正しようとするものである。
90年代以降、Windowsプログラマは、日付と時刻の値に関する最適とは言えない言い分に
対処してきた。Visual Basicには、日付、時刻、日付と時刻、期間の値に使われる
Dateクラスのみがあった。これにより、日付コンポーネントしか保持するつもりがなかった値に対して、
時間コンポーネントも取得しようとする場合によく問題が発生した。その逆も同じである。
.NET 1(VB 7)では、Date構造の名前がDateTimeに変更された。
より適切な名前であるが、日付のみの値と日付+時刻の値の両方を表す必要があるという
同じ問題があった。これは、タイムゾーン変換を実行するときに特に問題であった。
DateTime構造に格納されている日付のみの値は、午前1時あるいは午後11時の
時間コンポーネントを簡単に取得できる。後者の場合、1時間のオフセットにより、
日付コンポーネントが前日に変更される。
また、.NET 1には、TimeSpan構造の導入があった。これは期間を保存するように設計された。
しかし、多くの場合、その場しのぎの時間のみの構造として活用されていた。
繰り返すが、この手法には問題があった。
たとえば、午後10時に3時間を追加すると、予想される午前1時ではなく「1日と2時間」になる。
多くの場合、これは、値がデータベースの時間のみの列に挿入されるまで気付かれず、
その結果、オーバーフローエラーが発生する。
以下ソース これ完全な設計ミスに見えるしタイムゾーン気にしなきゃいけない外人の方が嵌りそうなのにこんなクソ仕様を押し通してたのか >>8
時差問題はDateTimeOffsetでいいんじゃないかな
他の設計ミスってなに? DOSの場合、日付と時刻が別のファンクションコールになってるやつか? >たとえば、午後10時に3時間を追加すると、予想される午前1時ではなく「1日と2時間」になる。
なんで1日と1時間にならないんだ…? >たとえば、午後10時に3時間を追加すると、予想される午前1時ではなく「1日と2時間」になる。
.NETなんて汚らしいもの触ったことないから知らないけど、どういうこと? ん? 1日と1時間じゃなくて?
11進数みたいになってるって事か? 意味不明だけど。 >>12
時刻を必要としない場合やその逆の型がない事そのものが設計ミスだろ >>4
今は虚数の時間も扱う時代だから細かいことは気にしない方がいいよね >>20
時刻不要は分かるけど日付は分からんな
俺が「時刻だけ保存する永続化」とか知らないからかね こんなの一回動かしゃわかる話。
アホ設計者やアホ机上コードレビュワーは文章だけでプログラマーが迷わないよう完璧にしようとムダに時間かける。
そんな設計もレビューも無駄。要求設計と受け入れ試験だけ書いてろ。 おれが遅刻したのも日帝強占期の35年を引けば予定時刻より遥かに早く到着したといえる >>18
.NETを汚らしいとかいえばプロっぽく聞こえるとか誰かに入れ知恵されたのか?
ただの素人の馬鹿としか思われないと思うよ >>23
RDBに時刻だけ保存するとか1に書いてある
1の文章見ても何がどうなって時間がずれるのか判らないけどな
日付や時間の型、タイムゾーン、時間の加算操作
辺りがどう関係しているのか判らない 実際に書いてみたら「1.01:00:00」とかいう計算結果になった
訳がわかんねえ >>32
金銭計算も苦手
小数以下の端数の切上げ切捨てで誤差が出がち >>34
計算しているうちに7桁目ぐらいで誤差が出ているときがあるな
単純な計算でも十数桁目以降を0にしているし そういや2000年問題んときIT系の会社にいて、とりあえず問題は無いと確認済みだけど数人は24時回るまで会社待機したな 10年は夢のよう
100年は夢また夢
1000年は一瞬の光の矢 でも、1日と2時間なんてことにはならなかったよ
書いた人が1日と1時間って書こうとしたのを間違ったんじゃないの 2時間はどこから来るんだろう?
使いづらいとかいうレベルの話じゃないよね、それ 時刻と期間を混同してるってこと?
なんかよく分からねえ 欧米どもの日時表記感覚はつくづくコンピューターの時代に向いてないよな
2021/05/29 17:40:00 ←この日時表記が文化的に受け入れられない
May 29th Sat., 21 5:40:00 AM ←こいうのじゃないと受け付けない
やれ月を数字で書くのは野蛮だの、
24時間表記はミリタリーtimeだからだの、
いろいろ言い訳ばかり
一方、シナさんは曜日すら数字で表すから合理的
月曜→星期一 火曜→星期ニ 水曜→星期三‥ >>29
実際.NETなんか知らんから素人の馬鹿で結構だけど、
お前さんが.NETに詳しいなら1日と2時間なんてアホな値になる理由を教えてくれ メリケンの感覚だと
midnightは12:00 AM
midnightの1分後は0:01 AMではなく12:01 AM
midnightの59分後は12:59 AM
んでmidnightの1時間後は? 1:00 AM
1より小さい0時台の時刻が彼らには存在しない
やつらバカじゃね? 深夜0時が12時24時0時の3つで認識されてるからだろ >>50
日常的に.NET使ってる俺でもこの記事が何を言ってるか分からんw
そもそも「時刻だけ」の概念が無いって書いてあるのに
「午後10時」っていうオブジェクトがある前提になっちゃってるよね 「shachiku」っていう関数を作って、何時間たってもその日扱いにするようにしたらいい
そしたら、28日は30時に退勤、29は7時に出勤って処理も簡単になる 1日と2時間3分4秒(1.02:03:04)を表すTimeSpanオブジェクトを作成
Dim ts1 As TimeSpan = TimeSpan.Parse("1.2:3:4")
1.2とかバカ過ぎw >>54
それを容れる代わりにNoukiという日付関数も欲しいわ
今月中納品の場合は5月31日過ぎても6月にならず
5月32日、33日とカウントアップしてゆく‥ // js
var omaTS = new Date().getFullYear();
if(omaTS==1622219194545) var otiTS = omaTS-otiTS; >>55
var okazanuriki = new Date("2021-05-29 18:28:28"); 何が何だか分からないw
普通に?間抜けな設計になってても、午後10時に 3時間を足して 1日と 1時間じゃねぇの?
なんで 2時間なんだ。
MS のそっち系のプログラムはエクセルの VBA でマクロをちょと書く程度やなぁ。日付、
時間がからむようなのはないな。
つうかみんなどうしてんの。unixtimeなライブラリ的なものを作る(でラッパーでくるむとか)
とかしたほうが楽な気がするな。 .NETしばらく触ってないけどこんな仕様だったのか >>48
ISO標準はわかりやすい順番なのに
どうして準拠しないんだろうかね? >>59
datetimeクラスがおかしいという話じゃなくて、時間を加減するときのTimeSpanがおかしいという話。
つか、VBをバカにする自称エリートプログラマ揃いのネラーさんは
>>1の記事の内容も読めないやつばかりでうんざりするな。 datetime構造は、日付のみと、日付時間がごっちゃになってるから
2つの併用ができない。だからdateonly構造とtimeonly構造の2つが追加された。
ということを言ってるだけなのにそれすら読み解けない低学歴揃いがネラー
これでVBをバカにする自称エリート気取ってんだから本当に病が深い >>65
専門的なことを門外漢に分かりやすく説明できない奴は賢ぶってるだけのバカ 時間の話でしょ?
旧 10+3=1日と2時間
新 10+3=1 >>51
いくらなんでもそれは冗談だよねw
え、ほんと? >>70
元の記事の「一日と二時間」は多分タイプミスで
「一日と一時間」が正しいと思う。んで、エクセル上で「午前一時」と入力してほしいときに
「一日と一時間」って入ってしまうとデータ処理に問題が出てくるよね。 >>48
そして
01/05/21が
DD/MM/YYなのか
MM/DD/YYなのか
分からずハマるパターン >>64
>>1 とソースにある、
> また、.NET 1には、TimeSpan構造の導入があった。これは期間を保存するように設計された。
> しかし、多くの場合、その場しのぎの時間のみの構造として活用されていた。
> 繰り返すが、この手法には問題があった。
>たとえば、午後10時に3時間を追加すると、予想される午前1時ではなく「1日と2時間」になる。
の部分やろ。
午後10時=0日と22時間 に 3時間=0日と3時間 を加算すると 1日と1時間 になるはずが、
.NET 1 の TimeSpan構造は 1日と2時間 になるってことか?
それとも、この前段にあるタイムゾーン変換でオフセット1時間云々が効いてくるってこと?
DSTまたぎが前提の内容とか? >>32
整数部は日にち
小数点以下は時間を表す。
1時間は1/24だ。
って知ってるか。 timespanに午後十時をいれようとするバカの記事
20時間をいれるための箱だ >>51
昔グーグルのスケジュールかなんかが昼の12時30をpm12:30って表示してて軽くパニックになったわ time_t を使えば、秒単位で足りる用途なら、全部解決。
ただ、ちょっと使い方が難しいので、プロ未満のITドカタには無理。 >>29
おいプロのおっさん、はよ教えてくれよ1日2時間になる理由を この記事書いた奴が.NET嫌いだっていうだけで
日付と時刻を分離したクラスを実装したっていうだけの話だなこれ GPSの日が7168日戻るせいで古い端末が使えなくなったのは知られてないな
現在位置を知るだけなら問題ないもんな timespanは時間間隔を入れるもので、時刻を入れるのはdatetimeだろ
そのへん理解出来てない
datetime型の午後10時にtimespan型の3時間を足せばいい 日付とか時間の処理はどの言語もまだまだ改善点はあると思うわ リファレンス読んでわかった気になって、だろう、はずだ、であるべき、で作って一度も通さず本番リリースするのがアホってだけ。
そもそも時間なんて不安定なものは数値で扱うのがどうかしてる。
文字列で渡せばいいんだよ。バカなやり方で結構、間違いさえしなけりゃな。 ■ このスレッドは過去ログ倉庫に格納されています