Bagaimana menemukan hari dalam seminggu di php dalam zona waktu tertentu

95

Saya bingung saat menggunakan php untuk menangani tanggal / waktu.

Apa yang saya coba lakukan adalah ini: Ketika seorang pengguna mengunjungi halaman saya, saya menanyakan zona waktunya dan kemudian menampilkan 'hari dalam seminggu' di zona waktunya.

Saya tidak ingin menggunakan hari browser. Saya ingin melakukan perhitungan ini di php.

Inilah cara saya mencoba mencapainya:

  1. Zona waktu yang dimasukkan oleh pengguna
  2. Stempel waktu Unix dihitung dengan fungsi waktu php ().

Tapi saya tidak tahu bagaimana melanjutkan ... Bagaimana saya bisa mendapatkan 'hari dalam seminggu' di zona waktu ini.

Matt Johnson-Pint
sumber

Jawaban:

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

Dimana $ dw akan menjadi 0 (untuk Minggu) hingga 6 (untuk Sabtu) seperti yang Anda lihat di sini: http://www.php.net/manual/en/function.date.php

Botond Béres
sumber
65
Sejak php 5.1.0 dapat Anda gunakan date("N", $timestamp)untuk mendapatkan 1..7nilai mulai dari hari Senin. Di versi yang lebih lama, Anda dapat menggunakan trik (date("w", $timestamp) + 6) % 7untuk mendapatkan 0..6nilai mulai dari hari Senin.
oluckyman
22
Saya sangat bingung. Bagaimana ini memiliki begitu banyak suara? Pertanyaannya adalah bagaimana mendapatkan hari dalam seminggu dalam zona waktu tertentu, bukan zona waktu server web, dan bukan GMT. Ini menjawab bagian pertama pertanyaan, tetapi mengabaikan bagian kedua dari pertanyaan.
tfinniga
6
@tfinniga, saya pikir alasannya adalah banyak orang datang ke pertanyaan ini ketika mencari bagaimana mendapatkan hari dalam seminggu (seperti yang saya lakukan), dan kemudian memilihnya, karena itu menjawab pertanyaan mereka :)
dav
Ketahuilah bahwa date () dan mktime () hanya berfungsi selama Anda bergerak dalam era UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF dalam hitungan detik). Gunakan "Ekstensi Terkait Tanggal dan Waktu" PHP baru
eosphere
1
@dav Wow, Anda mungkin benar, tapi sepertinya itu alasan yang sangat buruk. Saya merasa seperti saya mulai mengembangkan opini yang kuat tentang rata-rata pengembang php.
tfinniga
117

Solusi saya adalah ini:

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

Outputnya adalah: Tuesday

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

Outputnya adalah: Tue

trante
sumber
Ini bekerja dengan baik. Saya menggunakan tanggal ('D', strtotime ($ DATE)). Variabel $ DATE saya sudah dalam format yang benar. Saya menggunakan ini untuk mengidentifikasi DOW dalam database pelaporan yang saya buat. Saat mencari di beberapa tanggal, memiliki singkatan DOW ekstra itu bagus.
pengguna208145
21

Saya pikir ini adalah jawaban yang benar, cukup ubah Europe/Stockholmke zona waktu pengguna.

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

Representasi numerik ISO-8601 dari hari dalam seminggu (ditambahkan dalam PHP 5.1.0) 1 (untuk Senin) hingga 7 (untuk Minggu)

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

Untuk daftar zona waktu yang didukung, lihat http://php.net/manual/en/timezones.php

cjohansson.dll
sumber
20

Terima kasih banyak teman untuk komentar cepat Anda.

Inilah yang akan saya gunakan sekarang. Memposting fungsi di sini agar seseorang dapat menggunakannya.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Laporkan jika Anda menemukan koreksi.

Prajurit infanteri
sumber
9

Cara cepat lainnya:

date_default_timezone_set($userTimezone);
echo date("l");
Andre
sumber
5

Jika Anda bisa mendapatkan offset zona waktu mereka, Anda cukup menambahkannya ke stempel waktu saat ini dan kemudian menggunakan fungsi gmdate untuk mendapatkan waktu lokalnya.

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
nickf
sumber
3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

Ini harus bekerja (tidak mengujinya, jadi YMMV). Ia bekerja dengan menyimpan zona waktu skrip saat ini, mengubahnya ke yang ditentukan oleh pengguna, mendapatkan hari dalam seminggu daridate() fungsi pada stempel waktu yang ditentukan, dan kemudian menyetel zona waktu skrip kembali ke awal.

Anda mungkin memiliki beberapa petualangan dengan pengenal zona waktu.

Kalium
sumber
2

"Day of Week" sebenarnya adalah sesuatu yang bisa Anda dapatkan langsung dari fungsi php date () dengan format "l" atau "N". Lihat manualnya

edit: Maaf saya tidak membaca posting Kalium dengan baik, dia sudah menjelaskan itu. Salahku.

HerdplattenToni
sumber
2

Tanggal cek adalah Senin atau Minggu sebelum hari Senin atau Minggu terakhir

 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);
}
pengguna2214236
sumber
Meskipun ini mungkin memiliki kegunaan, itu tidak menjawab pertanyaan itu.
keluar
2

Berdasarkan salah satu solusi lain dengan bendera untuk beralih antara minggu-minggu mulai hari Minggu atau Senin

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);
}
Drinkynet
sumber
Meskipun ini mungkin memiliki kegunaan, itu tidak menjawab pertanyaan itu.
keluar
0

Representasi berbasis huruf standar dari bagian tanggal itu bagus, kecuali faktanya mereka tidak begitu intuitif. Cara yang jauh lebih mudah adalah mengidentifikasi abstraksi dasar dan sejumlah implementasi tertentu. Selain itu, dengan pendekatan ini, Anda dapat memperoleh manfaat dari pelengkapan otomatis.

Karena kita berbicara tentang waktu di sini, tampaknya masuk akal bahwa abstraksi dasarnya adalah ISO8601DateTime. Salah satu implementasi spesifik adalah datetime saat ini, yang Anda perlukan ketika a membuat permintaan ke backend Anda, karenanya Now()kelas. Yang kedua yang berguna bagi Anda adalah tanggal waktu yang disesuaikan dengan beberapa zona waktu. Tidak mengherankan, namanya disebut AdjustedAccordingToTimeZone. Dan akhirnya, Anda memerlukan satu hari dalam seminggu di zona waktu yang telah berlalu: ada LocalDayOfWeekkelas untuk itu. Jadi kodenya terlihat seperti berikut:

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

Untuk informasi lebih lanjut tentang pendekatan ini, lihat di sini .

Vadim Samokhin
sumber
-1
echo date('l', strtotime('today'));
raafet dhaouadi
sumber
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda.
andreas