You are here

function date_week in Date 7

Same name and namespace in other branches
  1. 5.2 date_api.module \date_week()
  2. 6.2 date_api.module \date_week()
  3. 6 date_api.module \date_week()
  4. 7.3 date_api/date_api.module \date_week()
  5. 7.2 date_api/date_api.module \date_week()

The calendar week number for a date.

PHP week functions return the ISO week, not the calendar week.

Parameters

string $date, in the format Y-m-d:

Return value

int calendar week number.

5 calls to date_week()
DateAPITestCase::testDateAPI in tests/date_api.test
date_views_argument_handler::get_default_argument in date_views/includes/date_views_argument_handler.inc
Set the empty argument value to the current date, formatted appropriately for this argument.
date_views_filter_handler::date_filter in date_views/includes/date_views_filter_handler.inc
date_weeks_in_year in date_api/date_api.module
The number of calendar weeks in a year.
template_preprocess_date_navigation in date_views/theme/theme.inc
Preprocessor to construct back and next navigation from the date argument.

File

date_api/date_api.module, line 1496
This module will make the date API available to other modules. Designed to provide a light but flexible assortment of functions and constants, with more functionality in additional files that are not loaded unless other modules specifically include them.

Code

function date_week($date) {
  $date = substr($date, 0, 10);
  $parts = explode('-', $date);
  $date = new DateObject($date . ' 12:00:00', 'UTC');

  // If we are using ISO weeks, this is easy.
  if (variable_get('date_api_use_iso8601', FALSE)) {
    return intval($date
      ->format('W'));
  }
  $year_date = new DateObject($parts[0] . '-01-01 12:00:00', 'UTC');
  $week = intval($date
    ->format('W'));
  $year_week = intval(date_format($year_date, 'W'));
  $date_year = intval($date
    ->format('o'));

  // remove the leap week if it's present
  if ($date_year > intval($parts[0])) {
    $last_date = clone $date;
    date_modify($last_date, '-7 days');
    $week = date_format($last_date, 'W') + 1;
  }
  elseif ($date_year < intval($parts[0])) {
    $week = 0;
  }
  if ($year_week != 1) {
    $week++;
  }

  // convert to ISO-8601 day number, to match weeks calculated above
  $iso_first_day = 1 + (variable_get('date_first_day', 1) + 6) % 7;

  // if it's before the starting day, it's the previous week
  if (intval($date
    ->format('N')) < $iso_first_day) {
    $week--;
  }

  // if the year starts before, it's an extra week at the beginning
  if (intval(date_format($year_date, 'N')) < $iso_first_day) {
    $week++;
  }
  return $week;
}