8

Delphi Xe、Win 7、System TimeZone UTC + 4:0、システムの最初の曜日-月曜日、時刻はtime.windows.comと同期されます

標準コンポーネントDelphiWin32のパレットには、コンポーネントMonthCalendarがあり、そのプロパティWeekNubers = true(週数の表示)、date = now、最初の日-月曜日です。

19番号(今日)-第43週の番号に表示されます。

dateutils.WeekOfTheYear(now)=42を返すことで番号をリクエストします。

ここに画像の説明を入力してください

ソース(0.5 Mb)http://www.sendspace.com/file/yuz6ko

コンポーネントMonthCalendarの初期コードから判断すると、すべてが真実であるように見えます(週の最初の日を公開しなくても、システムパラメーターから値を取得します)。

そして、WeekOfTheYearの問い合わせでは、すべてが標準ISOが適用されていると見なされていると言われていますが、数字は一致していません:(

いずれにせよ、1週間が消える場所はわかりません。カレンダーを見ると、43であるはずです。考慮すると、その53週と、昨年の最初の懸念事項です...

ちなみに、2011年1月1日のWeekOfTheYearも52を返しますが、1を返す必要があります...

なぜ区別し、どこが正しいのですか?

4

3 に答える 3

12

どちらの結果も正しいです。違いは、DateUtils.WeekOfTheYear関数がISO 8601標準の週の定義を使用しているためです。That is, a week is considered to start on a Monday and end on a Sunday.

ISO 8601 形式の週番号に関するこの説明を確認してください。

1 月 1 日が月曜日、火曜日、水曜日、または木曜日の場合は 01 週です。1 月 1 日が金曜日、土曜日、または日曜日の場合は、前年の 52 週または 53 週です (00 週はありません)。 . 12 月 28 日は常にその年の最後の週です。

DateUtils.WeekOfTheYearまた、関数の Embarcadero オンライン ヘルプには次のように書かれています。

....年の最初の暦日が金曜日、土曜日、または日曜日の場合、暦年の最初の 3 日間、2 日間、または 1 日間は、WeekOfTheYear は前年の最後の週を返します。同様に、年の最後の暦日が月曜日、火曜日、または水曜日の場合、暦年の最後の 1、2、または 3 日間については、WeekOfTheYear は 1 (次の暦年の最初の週) を返します。

したがって、2011 年 1 月 1 日が今週の土曜日であったため、前年の 52 週目と見なされます。

また、今日 (2011 年 10 月 19 日) に対して返される週番号が 43 ではなく 42 であることも説明しています。

于 2011-10-19T05:31:17.507 に答える
2

は年のTMonthCalendar最後の週を翌年の最初の週として扱うことができますが、WeekOfTheYear関数はそれを行わないため、違いが生じます。

たとえば、 によるとTMonthCalendar1 Jan 2012は 2011 年の最後の週と 2012 年の最初の週の両方に属します。は2012 年の第 22 Jan 2012週の最初の日です。関数に よると、2011 年の最後の週のみに属します。は、2012 年の最初の週の最初の日です
WeekOfTheYear1 Jan 20122 Jan 2012

月曜日は私にとって週の最初の日です。

于 2011-10-19T06:21:43.453 に答える
2

まず、TMonthCalendarコンポーネント内の週番号と によって返される週番号に違いは見られませんでしたDateUtils.WeekOfTheYear()。(私のシステムでは、月曜日が週の最初の日です。) どちらも42現在の週と52(でなく53) の週を示してい2011-01-01ます。(これは の53ため2010-01-01のものなので、単に混同しただけかもしれません。)

さて、それが52または53である理由については1、まあ、それはISO による最初の週の定義によるものです :

最初の週は、その年の最初の木曜日を含む週です。

したがって、2011 年の第 1 週は から始まり2011-01-03、前の週は前の ISO 年に属します。

于 2011-10-19T05:34:34.447 に答える