85

日付を取り、その週番号を計算したいと思います。

これまでのところ、私は以下を持っています。42になるはずなのに24を返します。

<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>

数字が逆になっているのは間違っていて偶然ですか?それとも私はもうすぐそこにいますか?

4

18 に答える 18

193

今日では、PHPのDateTimeオブジェクトを使用する方が優れています。

<?php
$ddate = "2012-10-18";
$date = new DateTime($ddate);
$week = $date->format("W");
echo "Weeknummer: $week";

mktime()、それは次のようになるからです:

mktime(hour, minute, second, month, day, year);

したがって、あなたの注文は間違っています。

<?php
$ddate = "2012-10-18";
$duedt = explode("-", $ddate);
$date  = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week  = (int)date('W', $date);
echo "Weeknummer: " . $week;
?>
于 2012-03-05T13:51:57.970 に答える
61
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
于 2012-03-05T13:52:23.247 に答える
20

PHPの日付関数を使用する
http://php.net/manual/en/function.date.php

date("W", $yourdate)
于 2012-03-05T13:50:08.847 に答える
12

これは今日の日付を取得し、その週の週番号を伝えます

<?php
 $date=date("W");
 echo $date." Week Number";
 ?>
于 2013-12-24T18:01:58.127 に答える
8

提案として:

<?php echo date("W", strtotime("2012-10-18")); ?>

そのすべてよりも少し単純かもしれません。

あなたができる他のこと:

<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?>
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>
于 2014-03-10T10:25:02.807 に答える
2

私は何年もの間この質問を解決しようとしました、私はより短い解決策を見つけたと思いましたが、長い話に再び戻らなければなりませんでした。この関数は、正しいISO週表記を返します。

/**
 * calcweek("2018-12-31") => 1901
 * This function calculates the production weeknumber according to the start on 
 * monday and with at least 4 days in the new year. Given that the $date has
 * the following format Y-m-d then the outcome is and integer.
 *
 * @author M.S.B. Bachus
 *
 * @param date-notation PHP "Y-m-d" showing the data as yyyy-mm-dd
 * @return integer
 **/
function calcweek($date) {
  // 1. Convert input to $year, $month, $day
  $dateset      = strtotime($date);
  $year         = date("Y", $dateset);
  $month        = date("m", $dateset);
  $day          = date("d", $dateset);

  $referenceday = getdate(mktime(0,0,0, $month, $day, $year));
  $jan1day      = getdate(mktime(0,0,0,1,1,$referenceday[year]));

  // 2. check if $year is a  leapyear
  if ( ($year%4==0 && $year%100!=0) || $year%400==0) {
    $leapyear = true;
  } else {
    $leapyear = false;
  }

  // 3. check if $year-1 is a  leapyear
  if ( (($year-1)%4==0 && ($year-1)%100!=0) || ($year-1)%400==0 ) {
    $leapyearprev = true;
  } else {
    $leapyearprev = false;
  }

  // 4. find the dayofyearnumber for y m d
  $mnth = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
  $dayofyearnumber = $day + $mnth[$month-1];
  if ( $leapyear && $month > 2 ) { $dayofyearnumber++; }

  // 5. find the jan1weekday for y (monday=1, sunday=7)
  $yy = ($year-1)%100;
  $c  = ($year-1) - $yy;
  $g  = $yy + intval($yy/4);
  $jan1weekday = 1+((((intval($c/100)%4)*5)+$g)%7);

  // 6. find the weekday for y m d
  $h = $dayofyearnumber + ($jan1weekday-1);
  $weekday = 1+(($h-1)%7);

  // 7. find if y m d falls in yearnumber y-1, weeknumber 52 or 53
  $foundweeknum = false;
  if ( $dayofyearnumber <= (8-$jan1weekday) && $jan1weekday > 4 ) {
    $yearnumber = $year - 1;
    if ( $jan1weekday = 5 || ( $jan1weekday = 6 && $leapyearprev )) {
      $weeknumber = 53;
    } else {
      $weeknumber = 52;
    }
    $foundweeknum = true;
  } else {
    $yearnumber = $year;
  }

  // 8. find if y m d falls in yearnumber y+1, weeknumber 1
  if ( $yearnumber == $year && !$foundweeknum) {
    if ( $leapyear ) {
      $i = 366;
    } else {
      $i = 365;
    }
    if ( ($i - $dayofyearnumber) < (4 - $weekday) ) {
      $yearnumber = $year + 1;
      $weeknumber = 1;
      $foundweeknum = true;
    }
  }

  // 9. find if y m d falls in yearnumber y, weeknumber 1 through 53
  if ( $yearnumber == $year && !$foundweeknum ) {
    $j = $dayofyearnumber + (7 - $weekday) + ($jan1weekday - 1);
    $weeknumber = intval( $j/7 );
    if ( $jan1weekday > 4 ) { $weeknumber--; }
  }

  // 10. output iso week number (YYWW)
  return ($yearnumber-2000)*100+$weeknumber;
}

私の短い解決策は、1901ではなく1801を返したため、2018-12-31を見逃していることがわかりました。そのため、正しいこの長いバージョンを入力する必要がありました。

于 2018-02-20T06:27:23.547 に答える
2

IntlGregorianCalendarクラスを使ってみませんか?

要件:使用を開始する前に、またはがサーバーにインストールされてIntlGregorianCalendarいることを確認してください。したがって、CLIで実行します。libicupecl/intl

php -m

intlリストに表示されている場合は[PHP Modules]、を使用できますIntlGregorianCalendar

DateTime vs IntlGregorianCalendarIntlGregorianCalendarより良くはありませんDateTime。しかし、良い点IntlGregorianCalendarは、週番号がとして表示されることintです。

例:

$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'

$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39
于 2020-10-22T13:20:08.607 に答える
2

あなたが年と週を必要とするとき、より難しくなります。
2017年1月1日がどの週か調べてみてください。
(2016年の第52週であり、2016年12月26日月曜日から2017年1月1日日曜日までです)。

長い検索の後、私は見つけました

strftime('%G-%V',strtotime("2017-01-01"))

結果:2016-52


https://www.php.net/manual/de/function.strftime.php
ISO-8601:1988年の最初の週から始まり、少なくとも4つの平日があり、月曜日が始まりである、特定の年の週番号。その週の。(01から53)


mysqlでの同等のものは、DATE_FORMAT(date、'%x-%v') https://www.w3schools.com/sql/func_mysql_date_format.asp
週です。ここで、月曜日は週の最初の日(01から53)です。


date()またはDateTimeで対応するソリューションが見つかりませんでした。
少なくとも、「+ 1day、先週の月曜日」のような解決策がないわけではありません。

于 2020-11-02T08:18:38.013 に答える
1
<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>

mktimeのパラメータが間違っていました-日/月/年ではなく、月/日/年である必要があります

于 2012-03-05T13:51:35.070 に答える
1

北米での日付の週番号を取得するには、次のようにします。

function week_number($n)
{
    $w = date('w', $n);
    return 1 + date('z', $n + (6 - $w) * 24 * 3600) / 7;
}

$n = strtotime('2022-12-27');
printf("%s: %d\n", date('D Y-m-d', $n), week_number($n));

そして取得:

Tue 2022-12-27: 53

于 2018-08-01T05:36:45.507 に答える
1

上記の例のほとんどは、1年が53週間の場合(2020年など)に問題を引き起こします。したがって、4年ごとに1週間の違いが発生します。このコードは次のことを行いません。

$thisYear = "2020";
$thisDate = "2020-04-24"; //or any other custom date
$weeknr = date("W", strtotime($thisDate)); //when you want the weeknumber of a specific week, or just enter the weeknumber yourself

$tempDatum = new DateTime();
$tempDatum->setISODate($thisYear, $weeknr);
$tempDatum_start = $tempDatum->format('Y-m-d');
$tempDatum->setISODate($thisYear, $weeknr, 7);
$tempDatum_end = $tempDatum->format('Y-m-d');

echo $tempDatum_start //will output the date of monday
echo $tempDatum_end // will output the date of sunday
于 2020-04-24T11:09:02.947 に答える
0

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

私は個人的にこの種の計算にZend_Dateを使用しており、今日の週を取得するのはこれほど簡単です。日付を操作する場合、他にも多くの便利な機能があります。

$now = Zend_Date::now();
$week = $now->get(Zend_Date::WEEK);
// 10
于 2012-03-05T13:47:45.243 に答える
0

コードは機能しますが、4番目と5番目の引数を反転する必要があります。

私はこのようにします

$date_string = "2012-10-18";
$date_int = strtotime($date_string);
$date_date = date($date_int);
$week_number = date('W', $date_date);
echo "Weeknumber: {$week_number}.";

また、そのコードを1週間見ていないと、変数名がわかりにくくなります。http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/を読むことを検討してください。

于 2012-03-05T13:48:32.090 に答える
0

日付2018-12-31の正しい週数を取得するには、以下のコードを使用してください

$day_count = date('N',strtotime('2018-12-31'));
$week_count = date('W',strtotime('2018-12-31'));    


if($week_count=='01' && date('m',strtotime('2018-12-31'))==12){
    $yr_count = date('y',strtotime('2018-12-31')) + 1;
}else{
    $yr_count = date('y',strtotime('2018-12-31'));
}
于 2019-03-08T11:32:48.930 に答える
0

jalaiカレンダーで週番号を取得するには、次を使用できます。

$weeknumber = date("W"); //number week in year
$dayweek = date("w"); //number day in week
if ($dayweek == "6")
{
    $weeknumberint = (int)$weeknumber;
    $date2int++; 
    $weeknumber = (string)$date2int;
}

echo $date2;

結果:

15

土曜日の週番号の変更

于 2020-04-10T08:11:00.417 に答える
0

非常にシンプル1行だけ:

<?php $date=date("W"); echo "Week " . $date; ?>"

また、たとえば、グラフに必要なように、減算して前の週を次のように取得することもできます。

<?php $date=date("W"); echo "Week " . ($date - 1); ?>
于 2021-12-01T14:20:20.670 に答える
-1
function last_monday($date) 
{
    if (!is_numeric($date))
        $date = strtotime($date);
    if (date('w', $date) == 1)
        return $date;
    else
        return date('Y-m-d',strtotime('last monday',$date));
}
$date = '2021-01-04';  //Enter custom date
$year = date('Y',strtotime($date));
$date1 = new DateTime($date);
$ldate = last_monday($year."-01-01");
$date2 = new DateTime($ldate);
$diff = $date2->diff($date1)->format("%a");
$diff = $diff/7;
$week = intval($diff) + 1;
echo $week;
//Returns 2.
于 2015-12-08T08:18:31.253 に答える
-1

このソリューションを試してください

date( 'W', strtotime( "2017-01-01 + 1 day" ) );
于 2017-02-27T11:07:43.003 に答える