2016-11-30 7 views
6

ロケールに基づいて最初と最後の日を検索しようとしています。 米国の週は日曜日に始まりますが、他の国では月曜日から土曜日までに始まる可能性があります。ロケールに基づいて最初と最後の日を検索します

setlocale(LC_ALL, "en_US.UTF-8"); 
date_default_timezone_set("America/New_York"); 

$start_week = (new DateTimeImmutable()); 
$start_week = $start_week->modify('this week'); 
$end_week = $start_week->modify('this week +6 days'); 

$interval = new DateInterval('P1D'); 
$week_range = new DatePeriod($start_week, $interval, $end_week); 

foreach($week_range as $week_day) { 
    // $week_day starts with Monday, supposed to be Sunday 
} 
+0

カレンダーの「Start of week」は、多くの場合、文化的なデフォルトの上のユーザーの好みです。あなたが米国に住んでいても、あなたのカレンダーの表示を月曜日に開始することをお勧めします。 – Leith

+0

@レース:私のWindows、Outlook、iPhoneのカレンダーはすべて日曜日に始まります。これらのカレンダーの開発者は、そのような言い訳をしていませんでした。 –

+0

あなたのGoogleカレンダーで選択できるようになります。ロケールに基づいてデフォルトを設定するのは良い考えではないと言っているわけではありません。ただ石で設定する必要はないと言っているだけです。 – Leith

答えて

8

これを行う1つの方法は、IntlCalendarクラスを使用することです。開始日のDateTimeImmutable::modify()を呼び出すときに開始日に日を追加する

const integer DOW_SUNDAY = 1 ; 
const integer DOW_MONDAY = 2 ; 
const integer DOW_TUESDAY = 3 ; 
const integer DOW_WEDNESDAY = 4 ; 
const integer DOW_THURSDAY = 5 ; 
const integer DOW_FRIDAY = 6 ; 
const integer DOW_SATURDAY = 7 ;

用途:それはIntlCalendarDOW_定数に対応し、整数を返すメソッドgetFirstDayofWeek()を、持っています。 3つのロケール(、en_US、es_ES、sw_KE)をthis phpfiddleに表示してください。

$locale = 'es_ES'; //Spain Spanish locale 
$cal1 = IntlCalendar::createInstance(NULL, $locale); 
$firstDayOfWeek = $cal1->getFirstDayOfWeek(); 
$daysToAdd = $firstDayOfWeek - 2; //difference from US M-Sunday 
echo 'locale: '.$local.' first day of week: '.$cal1->getFirstDayOfWeek().' days to add: '.$daysToAdd.'<br />'; 
$start_week = new DateTimeImmutable(); 
$start_week = $start_week->modify('this week +'.$daysToAdd.' days'); 
$end_week = $start_week->modify('+6 days'); 
$interval = new DateInterval('P1D'); 
$week_range = new DatePeriod($start_week, $interval, $end_week); 

foreach($week_range as $week_day) { 
    echo 'week day: '.$week_day->format('l m/d/Y').'<br />'; 
} 
+0

私はこれがPHPでそれを行うための*唯一のネイティブな方法だと思います: 'IntlCalendar'は[ICU](http://site.icu-project.org/)を使用し、堅牢な[CLDRデータベース]( http://cldr.unicode.org/)。一方、「DateTime」は、[Olson zoneinfoデータベース](https://blog.jonudell.net/2009/10/23/a- literary-appreciation-of-the-olsonzoneinfotz-database/)を使用します。週の開始情報は含まれていません。 – bishop

+0

良い解決策。しかし、どうすれば「今週」のような相対的な時間を避けることができますか?後で '$ start_week'オブジェクトを使う必要があります。言い換えれば、オブジェクトの任意の日付($ start_week = $ start_week-> setTimestamp($ my_ts))に週の最初の曜日を指定できるようにしたいと考えています。 –

+0

「$ my_ts」にはさまざまな日付(例:_07/04/1776_)が含まれているため、その曜日が何であるかを知る必要がありますか?だから、その週の番号と_local_の最初の曜日との間の違いを見つける必要がありますか?シナリオを説明できますか? –

関連する問題