0

Unix 環境 (Linux、BSD など)からの、または互換性のある time_t 値を取得した場合gettimeofday()、月内の対応する週番号を教えてくれるコンパクトなアルゴリズムはありますか?

理想的には、戻り値は の動作と同様に機能しますが%Wstrftime()年内の週ではなく月内の週を指定する点が異なります。

Javaには、W私が求めていることと多かれ少なかれ似たようなフォーマットトークンがあると思います。


[回答の後に書かれた以下のすべては、David Nehme、Branan、および Sparr によって投稿されました。]

%Wこの結果を と同様の方法で返すには、これまでにその月に発生した月曜日の数をカウントする必要があることに気付きました。その数値がゼロの場合、0 が返されます。

特に David Nehme と Branan には、物事を正しい軌道に乗せるためのソリューションを提供してくれたことに感謝します。[Branan の変数名を使用して] を返すコードのビットは((ts->mday - 1) / 7)、現在の日付より前に発生した完全な週数を示します。

ただし、これまでに発生した月曜日の数を数えている場合は、今日を含む整数の週数を数えたいと考え、残りの端数週にも月曜日が含まれているかどうかを検討します。

週全体を取り出した後に残った端数週に月曜日が含まれているかどうかを判断するには、それを考慮ts->mday % 7して曜日と比較する必要がありts->wdayます。これは、組み合わせを書き出すと簡単にわかりますが、その日が日曜日でないことを確認した場合 ( wday > 0)、ts->wday <= (ts->mday % 7)月曜日のカウントを常に 1 ずつ増やす必要があります。月、および最初の端数週内の現在の曜日に基づいて、端数週に月曜日が含まれるかどうか。

したがって、Branan の return ステートメントを次のように書き直します。

return (ts->tm_mday / 7) + ((ts->tm_wday > 0) && (ts->tm_wday <= (ts->tm_mday % 7)));

4

3 に答える 3

1

最初の週を月の 1 ~ 7 日、2 番目の週を 8 ~ 14 日と定義すると、次のコードが機能します。

int week_of_month( const time_t *my_time)
{
  struct tm *timeinfo;

  timeinfo =localtime(my_time);
  return 1 + (timeinfo->tm_mday-1) / 7;

}
于 2008-09-18T22:03:57.310 に答える
1

最初の週が週 1 であると仮定します。

int getWeekOfMonth()
{
  time_t my_time;
  struct tm *ts;

  my_time = time(NULL);
  ts = localtime(&my_time);

  return ((ts->tm_mday -1) / 7) + 1;
}

インデックスが 0 の場合+1は、return ステートメントで を削除します。

于 2008-09-18T21:52:51.907 に答える
0

この疑似コードを考えてみましょう。私はほとんど C 構文で書いていますが、他の言語から機能を借りることができるふりをしています (string->int 代入、string->time 変換)。選択した言語に適応または拡張します。

int week_num_in_month(time_t timestamp) {
  int first_weekday_of_month, day_of_month;
  day_of_month = strftime(timestamp,"%d");
  first_weekday_of_month = strftime(timefstr(strftime(timestamp,"%d/%m/01")),"%w");
  return (day_of_month + first_weekday_of_month - 1 ) / 7 + 1;
}

明らかに、1 ~ 7 日、8 ~ 13 日などではなく、標準時間関数が年間の週を処理する方法で月の週を処理したいと想定しています。

于 2008-09-18T22:06:33.047 に答える