Laravel - sprawdzanie daty

0

Cześć,
chcę w lara sprawdzić, dokładnie porównać, datę. Data rozpoczęcia, data zakończenia, Mam taki kod

$data->where('start_date', '>', Carbon::now());
$data->where('end_date', '<', Carbon::now());

działa prawie prawidłowo. Prawie dlatego że wykrywa zmianę z różnicą około 12-24h.

Jak można to naprawić?

Dzięki :)

3

W jakim formacie masz te pola end_date i start_date? Co zwraca Carbon::now()?
Nie masz jakiegoś przesunięcia w strefach czasowych?

0

Carbon now zwraca

Illuminate\Support\Carbon @1626270693 {#24
  #endOfTime: false
  #startOfTime: false
  #constructedObjectId: "000000004739fae1000000007d794dcb"
  #localMonthsOverflow: null
  #localYearsOverflow: null
  #localStrictModeEnabled: null
  #localHumanDiffOptions: null
  #localToStringFormat: null
  #localSerializer: null
  #localMacros: null
  #localGenericMacros: null
  #localFormatFunction: null
  #localTranslator: null
  #dumpProperties: array:3 [
    0 => "date"
    1 => "timezone_type"
    2 => "timezone"
  ]
  #dumpLocale: null
  date: 2021-07-14 13:51:33.271994 UTC (+00:00)
}

w bazie mam jako datetime

właśnie zastanawiam się czy nie ma jakiegoś przesunięcia, jak można to sprawdzić?

1

Skoro to datetime w bazie to albo masz dziwnie kolumy nazwane albo coś robisz źle.
Początek zakresu to start_date załóżmy 01-01-2021 1200. Koniec to: end_date 01-07-2021 1200 a sprawdzasz to z datą obecną co się nie zazębia.
Jaki masz okres tego czasu i czemu sprawdzasz obie kolumny sprawdzasz z czasem obecnym?

0

Hmm, faktycznie masz rację.
Chodzi tutaj o aukcję. Powiedzmy że mamy aukcję która trwa powiedzmy od 01-01-2021 1200 do 07-01-2021 1200 to jak sprawdzać (i zapisywać) kiedy aukcja jest trwająca, nadchodząca i archiwalna?

2

Trwające będą miały end_date mniejsze niż dziś.
Arxhiwalne end_datę mniejsze.
NadchodZące start_date większe.
W.SQL możesz użyć case lub dac 3 selecty i Union.
Ja bym rozważał na Twoim miejscu jeszcze jakąś kolumnę ze stanem i jakiś cron, który by to zmieniał.

0

no i właśnie coś takiego chciałem zrobić

$data->where('start_date', '>', Carbon::now()); nadchodzące
$data->where('end_date', '<', Carbon::now());  archiwalne

tak, myślę o cronie uruchamianym co minutę i sprawdzanie tego no i zmiana stanu oczywiście tylko najpierw muszę tą różnicę w czasie ogarnąć

1

No ale to dwa zapytania. Piszę z telefonu wiec pseudokod

DB:Select(id, 'trwającą')->where(start_date, >, teraz)
->and_where(end_date < teraz )
->union(
->(id, 'zakończona)->where (end_date  < teraz)
//...
-> get()
0

Jaki cron ? jakie dwa zapytania ? o co tu chodzi ? W ogóle jakie jest pytanie / zadanie ?
Chcesz porównać datę zakończenia i datę rozpoczęcia to robisz to

start_date <=> end_date

-1 : mniejsza
0: rowna
1: większa

0

To nie takie proste jak się wydaje, robiłem już takie systemy wiec to co ci mogę poradzić to na początek zrób tak:

  1. stwórz tabele z aukcjami niech beda to zwykle aukcje ze statusem: active
  2. wstaw do tabeli 10 milionów rekordów, moga byc takie same
  3. Zrob skrypt php w ktorym policzysz czas wykonania skryptu i zmien w tych 10 milionach statusy na: close
  4. Zobacz ile czasu wykona sie skrypt, który pozamyka ci 10 milionow aukcji
  5. powtorz kroki o2 do 4 tylko teraz wstaw 100 milionow aukcji
  6. teraz powiedz co ci da cron uruchamiany co 60 sekund ? jesli w trakcie jego wykonania uruchomi sie ponownie skrypt z krona bo ten pierwszy nie ogarnie wszystkich auckji i trzeci uruchomi sie zanim te 2 sie skoncza

Kolejna kwestia crona to za wyjatkiem zamykania aukcji, masz tez tam zamiar wysylac emaile do tych aukcji co sie zakonczyly? do uzytkownikow ? wszystko bedzie robil ten cron ? no nie. Musisz uruchomic z crona skrypt ktory po uruchomieniu zmienia sobie flage na 1 i wstawia sobie do kolejki w larawerze to co ma pozamykac. A system kolejki uruchamia job i tam wysyla maile zmienia statusy itd. wiec te wyslane aukcje z crona zmieniasz status na queue_to_close a kolejka wysyla maile zmiania ststu na zamkniete itd.

Nie wiem też o jakiej różnicy mowisz jakies 12 - 24 godziny ? o co tu chodzi ?
No i kazda aukcja na ktora ktos wejdzie musi byc indywidualnie sprawdzana czy jej czas minal. jesli tak to wstaw do kolejki do zamkniecia i pokaz status ze aukcja uz sie zakonczyla

i na koniec musisz obsluzyc w ajaxie tych co otworzyli aukcje o 9 rano i maja ja otwarta do konca aukcji, zeby ajax zamykal taka aukcje , oczywiscie pogladowo bo kazde pobicie w aukcji i tak jest sprawdzane po stronie serwera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1