特定のタイムゾーンのPHPで曜日を見つける方法


95

PHPを使用して日付/時刻を処理しているときに混乱しています。

私がやろうとしているのは、ユーザーが自分のページにアクセスしたときに、タイムゾーンを尋ね、タイムゾーンに「曜日」を表示することです。

ブラウザの日を使いたくありません。この計算をphpで行いたいのですが。

これは私がそれを達成しようとしている方法です:

  1. ユーザーが入力したタイムゾーン
  2. php time()関数によって計算されたUnixタイムスタンプ。

しかし、どうすればよいかわかりません...このタイムゾーンで「曜日」を取得するにはどうすればよいですか。

回答:


145
$dw = date( "w", $timestamp);

ここで確認できるように、$ dwは0(日曜日の場合)から6(土曜日の場合)までです。http//www.php.net/manual/en/function.date.php


65
PHP 5.1.0以降では、月曜日から値date("N", $timestamp)を取得するために使用できます1..7。古いバージョンでは、トリック(date("w", $timestamp) + 6) % 7を使用して0..6月曜日から値を取得できます。
幸運な人2013年

22
私はとても混乱しています。これはどのようにして非常に多くの票を持っているのですか?問題は、Webサーバーのタイムゾーンではなく、GMTではなく、特定のタイムゾーンで曜日を取得する方法です。これは質問の最初の部分に答えますが、質問の2番目の部分は完全に無視します。
tfinniga 2013年

6
@tfinnigaが、私は:)それは彼らの質問に答えるその理由は、多くの人々は、曜日を取得する方法を検索するときに(私が行ったように)この質問に来て、その後、それを投票されたと思う
DAV

date()およびmktime()が機能するのは、UNIX時代(1970-2038 / 0x0-0x7FFFFFFF秒)内に移動する場合のみであることに注意してください。使用して、新しいPHP「日付と時刻関連の機能拡張」
eosphere

1
@davうわー、あなたはおそらく正しいですが、それは本当に悪い理由のようです。私は平均的なPHP開発者について強い意見を持ち始めているように感じます。
tfinniga 2015

117

私の解決策はこれです:

$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));

出力は次のとおりです。 Tuesday

$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));

出力は次のとおりです。 Tue


これは美しく機能します。私はdate( 'D'、strtotime($ DATE))を使用しました。$ DATE変数はすでに正しい形式でした。これを使用して、作成したレポートデータベースでDOWを識別しました。複数の日付にわたって検索する場合、DOWの省略形を少し追加すると便利です。
user208145 2016年

21

これは正解だと思いますEurope/Stockholm。ユーザーのタイムゾーンに変更してください。

$dateTime = new \DateTime(
    'now',
    new \DateTimeZone('Europe/Stockholm')
);
$day = $dateTime->format('N');

曜日のISO-8601数値表現(PHP 5.1.0で追加)1(月曜日)から7(日曜日)

http://php.net/manual/en/function.date.php

サポートされているタイムゾーンのリストについては、http://php.net/manual/en/timezones.phpを参照してください


20

簡単なコメントありがとうございます。

これは私が今使うものです。誰かが使用できるように、ここに関数を投稿します。

public function getDayOfWeek($pTimezone)
{

    $userDateTimeZone = new DateTimeZone($pTimezone);
    $UserDateTime = new DateTime("now", $userDateTimeZone);

    $offsetSeconds = $UserDateTime->getOffset(); 
    //echo $offsetSeconds;

    return gmdate("l", time() + $offsetSeconds);

}

訂正があれば報告してください。



5

タイムゾーンのオフセットを取得できる場合は、それを現在のタイムスタンプに追加してから、gmdate関数を使用してローカル時間を取得できます。

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);

3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

これは動作するはずです(テストしなかったので、YMMV)。スクリプトの現在のタイムゾーンを保存し、ユーザーが指定したタイムゾーンに変更date()し、指定されたタイムスタンプで関数から曜日を取得し、スクリプトのタイムゾーンを最初のタイムゾーンに戻します。

ただし、タイムゾーン識別子を使用した冒険がいくつかあるかもしれません。


2

「曜日」は実際には、phpのdate()関数から直接「l」または「N」の形式で取得できるものです。見て 、手動

編集:申し訳ありませんが、Kaliumの投稿を適切に読みませんでした、彼はすでにそれを説明しました。私の悪い。


2

確認日は、最終月曜日または最終日曜日を取得する前の月曜日または日曜日です

 public function getWeek($date){
    $date_stamp = strtotime(date('Y-m-d', strtotime($date)));

     //check date is sunday or monday
    $stamp = date('l', $date_stamp);      
    $timestamp = strtotime($date);
    //start week
    if(date('D', $timestamp) == 'Mon'){            
        $week_start = $date;
    }else{
        $week_start = date('Y-m-d', strtotime('Last Monday', $date_stamp));
    }
    //end week
    if($stamp == 'Sunday'){
        $week_end = $date;
    }else{
        $week_end = date('Y-m-d', strtotime('Next Sunday', $date_stamp));
    }        
    return array($week_start, $week_end);
}

これには用途があるかもしれませんが、質問には答えません。
2014年

2

日曜日または月曜日から始まる週を切り替えるフラグを持つ他のソリューションの1つに基づく

function getWeekForDate($date, $weekStartSunday = false){

    $timestamp = strtotime($date);

    // Week starts on Sunday
    if($weekStartSunday){
        $start = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Sunday', $timestamp));
        $end = (date("D", $timestamp) == 'Sat') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Saturday', $timestamp));
    } else { // Week starts on Monday
        $start = (date("D", $timestamp) == 'Mon') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Monday', $timestamp));
        $end = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Sunday', $timestamp));
    }

    return array('start' => $start, 'end' => $end);
}

これには用途があるかもしれませんが、質問には答えません。
2014年

0

日付の部分の標準的な文字ベースの表現は、直感的でないという点を除いて優れています。より便利な方法は、基本的な抽象化といくつかの特定の実装を識別することです。さらに、このアプローチでは、オートコンプリートから恩恵を受けることができます。

ここでは日時について話しているので、基本的な抽象化はであると考えられISO8601DateTimeます。特定の実装の1つは現在の日時ですNow()。これは、バックエンド、つまりクラスにリクエストを出すときに必要なものです。2番目に便利なのは、あるタイムゾーンに調整された日時です。当然のことながら、それはと呼ばれていAdjustedAccordingToTimeZoneます。そして最後に、渡された日時のタイムゾーンで曜日が必要LocalDayOfWeekです。そのためのクラスがあります。したがって、コードは次のようになります。

(new LocalDayOfWeek(
    new AdjustedAccordingToTimeZone(
        new Now(),
        new TimeZoneFromString($_POST['timezone'])
    )
))
    ->value();

このアプローチの詳細については、こちらをご覧ください


-1
echo date('l', strtotime('today'));

このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.