Belirli bir zaman diliminde php'de haftanın günü nasıl bulunur


97

Tarih / saati işlemek için php kullanırken kafam karıştı.

Yapmaya çalıştığım şey şudur: Bir kullanıcı sayfamı ziyaret ettiğinde saat dilimini soruyorum ve ardından saat diliminde 'haftanın gününü' görüntülüyorum.

Tarayıcının gününü kullanmak istemiyorum. Bu hesaplamayı php olarak yapmak istiyorum.

Ben de bunu başarmaya çalışıyorum:

  1. Kullanıcı tarafından girilen saat dilimi
  2. Php time () işlevi tarafından hesaplanan Unix zaman damgası.

Ama nasıl ilerleyeceğimi bilmiyorum ... Bu zaman diliminde 'haftanın gününü' nasıl alırım.

Yanıtlar:


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

Burada görebileceğiniz gibi $ dw 0 (Pazar için) ile 6 (Cumartesi için) arasında olacaktır: http://www.php.net/manual/en/function.date.php


65
Php 5.1.0'dan beri pazartesiden itibaren değerleri date("N", $timestamp)almak için kullanabilirsiniz 1..7. Eski sürümlerde , pazartesiden başlayarak değerleri (date("w", $timestamp) + 6) % 7almak için bu numarayı kullanabilirsiniz 0..6.
oluckyman

22
Kafam çok karışık. Bunun nasıl bu kadar çok oyu var? Soru, web sunucusunun saat diliminde değil, GMT'de değil, belirli bir saat diliminde haftanın gününün nasıl alınacağıdır. Bu, sorunun ilk bölümünü yanıtlar, ancak sorunun ikinci bölümünü tamamen görmezden gelir.
tfinniga

6
@tfinniga, sanırım sebebi, haftanın gününü nasıl elde edeceğimi araştırırken (benim yaptığım gibi) pek çok kişinin bu soruya gelip, sorularını yanıtladığı için oy vermesi :)
dav

Date () ve mktime () öğelerinin yalnızca UNIX döneminde (1970 - 2038 / 0x0 - 0x7FFFFFFF saniye) hareket ettiğiniz sürece çalıştığını unutmayın. Yeni PHP "Tarih ve
Saatle

1
@dav Wow, muhtemelen haklısın, ama bu gerçekten kötü bir neden gibi görünüyor. Ortalama php geliştiricisi hakkında güçlü fikirler geliştirmeye başladığımı hissediyorum.
tfinniga

117

Benim çözümüm şudur:

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

Çıktı: Tuesday

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

Çıktı: Tue


Bu çok güzel çalışıyor. Tarih ('D', strtotime ($ DATE)) kullandım. $ DATE değişkenim zaten doğru biçimdeydi. Bunu, yaptığım bir raporlama veritabanında DOW'u tanımlamak için kullandım. Birden çok tarih arasında arama yaparken, bu küçük ekstra DOW kısaltmasının olması güzeldir.
user208145


20

Hızlı yorumlarınız için çok teşekkürler arkadaşlar.

Şimdi kullanacağım şey bu. Birinin kullanabilmesi için işlevi burada yayınlamak.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Herhangi bir düzeltme bulursanız bildirin.


9

Başka bir hızlı yol:

date_default_timezone_set($userTimezone);
echo date("l");

5

Saat dilimi farkını alabiliyorsanız, bunu geçerli zaman damgasına ekleyebilir ve ardından yerel saati almak için gmdate işlevini kullanabilirsiniz.

// 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);

Bu işe yaramalı (test etmedi, yani YMMV). Komut dosyasının geçerli saat dilimini depolayarak, onu kullanıcı tarafından belirtilen saat dilimine değiştirerek date(), belirtilen zaman damgasındaki işlevden haftanın gününü alarak ve ardından komut dosyasının saat dilimini başlangıçta olduğu gibi ayarlayarak çalışır.

Yine de, zaman dilimi tanımlayıcılarla bazı maceralar yaşayabilirsiniz.


2

"Haftanın Günü" aslında doğrudan php date () işlevinden sırasıyla "l" veya "N" biçiminde alabileceğiniz bir şeydir. Kılavuza bir göz atın

düzenleme: Üzgünüm Kalium'un gönderilerini düzgün okumadım, bunu zaten açıkladı. Benim hatam.


2

Kontrol tarihi, son pazartesi veya son pazar gününden önceki pazartesi veya pazardır

 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);
}

Bunun kullanımları olsa da, soruyu cevaplamaz.
outis

2

Pazar veya Pazartesi'den itibaren haftalar arasında geçiş yapmak için bayraklı diğer çözümlerden birine dayanmaktadır

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);
}

Bunun kullanımları olsa da, soruyu cevaplamaz.
outis

0

Tarih bölümlerinin standart harf tabanlı temsilleri, çok sezgisel olmadıkları gerçeği dışında harikadır. Çok daha uygun yol, temel soyutlamaları ve bir dizi özel uygulamayı belirlemektir. Ayrıca bu yaklaşımla otomatik tamamlamadan yararlanabilirsiniz.

Burada veri zamanlarından bahsettiğimiz için, temel soyutlamanın olduğu mantıklı görünüyor ISO8601DateTime. Spesifik uygulamalardan biri, arka ucunuza bir istek yaptığında ihtiyacınız olan mevcut tarih saattir, dolayısıyla Now()sınıf. İkincisi, sizin için biraz yararlı olan, bir zaman dilimine ayarlanmış bir tarih saattir. Şaşırtıcı olmayan bir şekilde, buna denir AdjustedAccordingToTimeZone. Son olarak, geçen tarih saat diliminde haftanın bir gününe ihtiyacınız var: bunun için bir LocalDayOfWeeksınıf var. Dolayısıyla kod aşağıdaki gibi görünür:

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

Bu yaklaşım hakkında daha fazla bilgi için buraya bir göz atın .


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

Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
andreas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.