2016-03-25 11 views
3

Bir dizide saklanan haftanın bir gün ve saat için 3 değişken vardır: Birlikte gibi sırasıyla çıkış şeyBU gün Has ve zaman BU hafta geçirilen ya da değil - PHP

$shift['day']; 
$shift['hour']; 
$shift['meridian']; 

Tümü 3:

DATE hiç kullanılmıyor, sadece DAY ve TIME ve açıkça bir zaman damgası olarak saklanmadı.

BU DAY ve ZAMANIN bu hafta geçip geçmediğini nasıl kontrol edebilirim?

$today = date("l"); // Get current day "Monday" 
$hour = date("g"); // Get current hour "3" 
$meridian = date("A"); // Get current meridian "PM" 

bana değişkenleri karşılaştırmak için hazır akım değerleri alacak ama benim zaman zaten geçmişse bu hafta mantığı belirlemek için nasıl çalışacağını kaybolan veya değilim: Örneğin Yani

?

bir Yardım büyük takdir.

+0

Bunun için Javascript kullanmanız daha iyi olur. PHP sadece sunucuda çalışır. Bu, dünyanın herhangi bir yerinde olabileceğinden, saat dilimleri için ayarlamalar yapmanız gerekir. Solucanlar sadece başka bir kutu. – durbnpoisn

+0

Günün sayısal değerini öğrenin. 'N'. Muhtemelen 24 saat boyunca meridyenden daha iyi. – chris85

+0

@durbnpoisn Hayır, bunu PHP ile yapabilirim çünkü çıktı kesinlikle sunucu ile ilgili olacaktır (kullanıcı/tarayıcı/saat dilimi değil). Sadece mantığı bilmem gerek. – Grant

cevap

1

Değerleri tam sayılara indirmek için date işlevlerini kullanabilirsiniz, ardından yalnızca koşullu kullanın.

if(date('N', strtotime($shift['day'])) <= date("N") && date("G") <= $shift['hour']) { 

Demo: https://eval.in/542298

Eğer gece yarısı olabilir düştüğü zaman dilimi doğru aksi ayarlanmış olduğundan emin olun

$shift['day'] = 'Friday'; 
$shift['meridian'] = 'PM'; 
$hour = '10'; 
$shift['hour'] = ($shift['meridian'] == 'PM') ? $hour + 12 : $hour; //convert input to 24 hour 
$today = date("N"); 
$current_hour = date("G"); 
if(date('N', strtotime($shift['day'])) <= $today && $current_hour <= $shift['hour']) { 
    echo 'It hasn\'t occurred yet this week'; 
} else { 
    echo 'It has occurreced this week'; 
} 

... veya tek astar olarak ($shift['hour'] varsayarak 24 saattir) günü atmak

+0

Bu mükemmel, teşekkürler adam;) – Grant

2

Mantık:

  • şimdi
  • Friday 10 PM için DateTime nesne oluşturun için DateTime nesne oluşturun.

    $tz = new \DateTimeZone("UTC"); 
    $now = new \DateTime("now", $tz); 
    $then = \DateTime::createFromFormat('l g A', 'Friday 10 PM', $tz); 
    
    if($then->getTimestamp() < $now->getTimestamp()) 
    { 
        echo 'Friday 10 PM has passed this week'; 
    } 
    else 
    { 
        echo 'No, Friday 10 PM has not passed this week'; 
    } 
    

    Echoing $then->format('d.m.Y, H:i:s') verimleri 25.03.2016, 22:00:00:

  • büyük

Kod hangisi görmek için zaman damgaları bunları karşılaştırın. Günün "Cuma" dan "Cumartesi" ye doğru bir şekilde değiştirilmesi 26 Mart değerini verir; bu, DateTime nesnesinin verilen dize (Friday 10 PM) için doğru şekilde oluşturulduğunu doğrulamak için kullandım.

+0

Aslında diğer cevaplarla burada oynadıktan sonra, bu en güvenilir olan tek kişi olarak ortaya çıkıyor. DateTime API'sı daha önce kullanmadığım bir şeydi, ama bundan sonra kullanacağım her şey için kullanacağım. Çok teşekkürler Mjh, bu harika! – Grant

+0

Projenizde yararlı, iyi şanslar bulduğunuza ve güzel bir gün geçirdiğine sevindim! :) – Mjh

2

DateTime sınıf pek çok araç Bunu yaparken yardımcı olmak için sağlamaktadır ve another answer zaten kullanır, ancak bugüne kadar en büyük avantajı var aslında buna tamamen insan şekilde tarihlere çalışmak için izin vermesidir - don Matematiksel bir anlam kazanmış olan sayıları beslemeli!

İşte bunu yapmanın bir yolu ...

Açıkçası, biz ilk karşılaştırmak için indirdiği gerekir:

// With no arguments, this is just the current timestamp 
$now = DateTime(); 

// Tricky part here is to know that any omitted *calendar-type* values 
// default to the current day, while *time* values default to 0s 
$shift = DateTime::createFromFormat(
    'l g A', 
    "{$shift['day']} {$shift['hour']} {$shift['meridian']}" 
); 

Ama olan DateTime sınıf için PHP kılavuzunda (en azından ben bu yazıyorum zamanda) sert noktaya nedir Aslında sadece DateTimeInterface için TOC üzerinde görünen DateTime::diff() method.
Eğer, sadece + ve - işaretler "geleceği" ve "geçmiş" demek olduğunu bilmek gerektiğini olduğunda: Eğer date(), strtotime() ve matematik yoluyla aynı şeyi çoğaltabilirsiniz Tabii

if ($now->diff($shift)->format('%R') === '-') 
{ 
    // $shift is in the past; i.e. Friday 10 PM has passed 
} 

ama bu daha etkileyici ve kolay anlaşılır.

+0

Bu süper kaygan! ;) – Grant

İlgili konular