Mikrodetik tanggal php selalu 0

Fungsi microtime() mengembalikan cap waktu Unix saat ini dengan mikrodetik. Secara default, fungsi ini mengembalikan nilai string yang berisi mikrodetik dan detik yang dipisahkan oleh spasi (msec detik)

Sintaksis

microtime($get_as_float)

Parameter

Sr. No Parameter dan Keterangan 1

get_as_float(Opsional)

Ini adalah nilai boolean yang digunakan untuk menentukan apakah hasilnya harus berupa nilai floating point atau tidak. Jika Anda melewatkan nilai boolean true sebagai parameter, fungsi ini mengembalikan hasil sebagai nilai floating point

Nilai Pengembalian

Fungsi microtime PHP () mengembalikan stempel waktu Unix saat ini. Secara default ini mengembalikan nilai string dalam bentuk msec detik. Jika Anda meneruskan nilai boolean true sebagai parameter ke metode ini, metode ini mengembalikan waktu saat ini dalam detik sejak zaman Unix akurat ke mikrodetik terdekat

Example displaying each time format:

$dateTime = new DateTime();

foreach ([
   'ATOM',
   'COOKIE',
   'ISO8601',
   'RFC822',
   'RFC850',
   'RFC1036',
   'RFC1123',
   'RFC2822',
   'RFC3339',
   'RFC3339_EXTENDED',
   'RSS',
   'W3C',
   ] as $format) {
   eval("print 'DateTimeInterface::$format\t'.\$dateTime->format(DateTimeInterface::$format).\"\n\";");
}

The above example will output:

DateTimeInterface::ATOM    2020-01-28T16:22:37-07:00
DateTimeInterface::COOKIE    Tuesday, 28-Jan-2020 16:22:37 MST
DateTimeInterface::ISO8601    2020-01-28T16:22:37-0700
DateTimeInterface::RFC822    Tue, 28 Jan 20 16:22:37 -0700
DateTimeInterface::RFC850    Tuesday, 28-Jan-20 16:22:37 MST
DateTimeInterface::RFC1036    Tue, 28 Jan 20 16:22:37 -0700
DateTimeInterface::RFC1123    Tue, 28 Jan 2020 16:22:37 -0700
DateTimeInterface::RFC2822    Tue, 28 Jan 2020 16:22:37 -0700
DateTimeInterface::RFC3339    2020-01-28T16:22:37-07:00
DateTimeInterface::RFC3339_EXTENDED    2020-01-28T16:22:37.803-07:00
DateTimeInterface::RSS    Tue, 28 Jan 2020 16:22:37 -0700
DateTimeInterface::W3C    2020-01-28T16:22:37-07:00

6 tahun lalu oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, bagaimanapun
memiliki beberapa masalah

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus menelepon
    setTime lihat https. //3v4l. org/YUhFF Metode setMicroseconds adalah
    berguna dan/atau mendukung string relatif untuk menyetel mikrodetik ke 0 (hanya
    seperti tengah malam untuk H. i. s). Atau apakah saya melewatkan sesuatu?

  2. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?
    penamaan yang sangat mewah, tetapi sangat jelas apa yang akan terjadi

  3. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Diskusi ini dimulai di https. //github. com/php/php-src/pull/2186

Gr Arjen

oleh Dan Ackroyd — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Pemahaman saya adalah jika ini memengaruhi kode Anda, maka kode Anda
sudah memiliki asumsi buruk di dalamnya. Kode salah berasumsi
bahwa dua DateTime yang dihasilkan akan memiliki waktu yang sama
keduanya. *

Saya tidak sepenuhnya mengerti masalah apa yang ingin Anda selesaikan
diskusi ini. Tidak ada yang memaksa Anda untuk memperbarui ke PHP 7. 1
langsung;
asumsi buruk tentang waktu di DateTime yang dihasilkan sebelum Anda
tingkatkan ke PHP7. 1

tulis SjonHortensius

jika menghasilkan DateTime membutuhkan sekitar 4 μs (yang memang untuk saya), ini terjadi ~ 250. 000 kali
lebih sering

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu menghentikan Anda dari
mengabaikan kasus tepi dan pemrograman secara kebetulan. **

Saya menyadari bahwa memiliki rilis membuatnya lebih jelas bahwa kode rusak
rusak adalah hal yang menjengkelkan harus diperbaiki. tapi kode itu
sudah salah. Menunda fitur yang berguna, hanya untuk menghindari keharusan memperbaiki
kode yang tidak stabil bukanlah cara yang baik untuk melanjutkan proyek, imo

tulis dshafik

Saya pikir mikrodetik default ke 0 ketika tidak spesifik untuk string relatif adalah perilaku yang benar

Saya tidak berpikir itu terdengar seperti rencana yang bagus sama sekali. Saat membuat a
DateTime hingga

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_8 hanya
nilai tanggal diatur dari string input, sisa waktu diatur
sampai sekarang()

Bukankah memiliki mikrodetik berperilaku berbeda dengan yang lainnya
nilai waktu akan langsung menjadi bagian tambahan dari inkonsistensi
orang untuk menyesal?

Bersulang
Dan

  • Kode contoh yang tidak berfungsi dengan benar sekarang. Jika periode tidur adalah
    berkurang, menjadi kurang jelas bahwa kode tersebut rusak, tetapi memang demikian
    masih rusak

untuk ($i=0; $i<10; $i++) {
$dt1 = new DateTime('hari pertama bulan depan');
usleep(rand(0, 500000));
$dt2 = new DateTime('hari pertama bulan depan');

if ($dt1 == $dt2) {
    echo "Same\n";
}
else {
    echo "Different\n";
}

}

** Pemrograman secara Kebetulan -
https. //pragprog. com/the-pragmatic-programmer/extracts/coincidence

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena
    parameter ekstra (poin 3). SM istirahat
  2. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki
presisi mikrodetik sedangkan $fromDatabase tidak)

Di mana ini memiliki asumsi yang buruk?
memiliki presisi detik), dan sekarang gagal. Apakah itu asumsi yang buruk?
pikir itu hanya mundur tanpa cara yang baik untuk memperbaiki kode

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena ada yang hilang
metode setMicroseconds. Seseorang perlu memanggil setTime dengan jam yang diambil,
menit, detik atau setTimestamp($dt->format('U'))

"Hanya mengandalkan hal-hal yang dapat diandalkan. "

Arjen

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Pemahaman saya adalah jika ini memengaruhi kode Anda, maka kode Anda
sudah memiliki asumsi buruk di dalamnya. Kode salah berasumsi
bahwa dua DateTime yang dihasilkan akan memiliki waktu yang sama
keduanya. *

Saya tidak sepenuhnya mengerti masalah apa yang ingin Anda selesaikan
diskusi ini. Tidak ada yang memaksa Anda untuk memperbarui ke PHP 7. 1
langsung;
asumsi buruk tentang waktu di DateTime yang dihasilkan sebelum Anda
tingkatkan ke PHP7. 1

tulis SjonHortensius

jika menghasilkan DateTime membutuhkan sekitar 4 μs (yang memang untuk saya), ini terjadi ~ 250. 000 kali
lebih sering

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu menghentikan Anda dari
mengabaikan kasus tepi dan pemrograman secara kebetulan. **

Saya menyadari bahwa memiliki rilis membuatnya lebih jelas bahwa kode rusak
rusak adalah hal yang menjengkelkan harus diperbaiki. tapi kode itu
sudah salah. Menunda fitur yang berguna, hanya untuk menghindari keharusan memperbaiki
kode yang tidak stabil bukanlah cara yang baik untuk melanjutkan proyek, imo

tulis dshafik

Saya pikir mikrodetik default ke 0 ketika tidak spesifik untuk string relatif adalah perilaku yang benar

Saya tidak berpikir itu terdengar seperti rencana yang bagus sama sekali. Saat membuat a
DateTime hingga

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_8 hanya
nilai tanggal diatur dari string input, sisa waktu diatur
sampai sekarang()

Bukankah memiliki mikrodetik berperilaku berbeda dengan yang lainnya
nilai waktu akan langsung menjadi bagian tambahan dari inkonsistensi
orang untuk menyesal?

Bersulang
Dan

  • Kode contoh yang tidak berfungsi dengan benar sekarang. Jika periode tidur adalah
    berkurang, menjadi kurang jelas bahwa kode tersebut rusak, tetapi memang demikian
    masih rusak

untuk ($i=0; $i<10; $i++) {
$dt1 = new DateTime('hari pertama bulan depan');
usleep(rand(0, 500000));
$dt2 = new DateTime('hari pertama bulan depan');

if ($dt1 == $dt2) {
    echo "Same\n";
}
else {
    echo "Different\n";
}

}

** Pemrograman secara Kebetulan -
https. //pragprog. com/the-pragmatic-programmer/extracts/coincidence

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP: 5.6.28-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Strict Standards: Declaration of MyDate::setTime() should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…
_

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ cat doo2.php 
&lt;?php
$date = new DateTimeImmutable( "13:39:04.123456" );
var_dump( $date );
?>

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n doo2.php
object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:39:04.123456"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu berhenti
Anda dari mengabaikan kasus tepi dan pemrograman secara kebetulan

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

Menganggap serius berarti membaca pesan lengkap dan tidak
berfokus pada detail contoh (https. //3v4l. org/YUhFF menghadapi
masalah yang sama tanpa argumen konstruktor; . g. tidak mudah diatur
mikrodetik ke 0). Saya tidak pernah mengatakan kami menghadapi DateTime baru == baru
Masalah DateTime, tapi Dan memberikan pelajaran tentang asumsi yang buruk

Tidak ada komentar tentang tidak dapat menyetel microtime ke nol

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $ kucing doo. php
kelas MyDate memperluas DateTimeImmutable
{
fungsi setTime( $h, $i, $s )
{
kembali orang tua. setWaktu( $h, $i + 5, $s );
}
}

$a = new MyDate();
$b = $a->setWaktu( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $php -n doo. php

Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL, $mikrodetik = NULL) di /tmp/doo. php pada baris 9
objek(TanggalKu)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 30. 06. 371428"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(TanggalKu)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 02. 10. 10. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP. 5. 6. 28-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Standar Ketat. Deklarasi MyDate. setTime() harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

Saya pikir itu TIDAK melanggar (dan karenanya peringatan) LSP. Jika Anda LAKUKAN menggunakan
Argumen mikrodetik ke-4 dalam aplikasi Anda, Anda tidak dapat mengganti a
objek DateTime dengan CustomDate yang tidak memiliki argumen ke-4 ini,
bahkan DateTime yang tangguh memiliki nilai default untuk itu. Jika Anda ingin menyimpan a
waktu dengan mikrodetik dengan setTime, Anda berakhir tanpa mikrodetik jika
Anda mengganti DateTime dengan CustomDate

"[. ] jika S adalah subtipe dari T, maka objek bertipe T dapat diganti
dengan objek bertipe S (i. e. , objek bertipe T dapat diganti
dengan objek subtipenya dari tipe S) tanpa mengubah salah satu dari
properti yang diinginkan dari program itu (kebenaran, tugas yang dilakukan, dll. )"

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Ini dulu bekerja selama 7 tahun, dan sekarang tidak. Jika saya tidak disimpan
detik, itu tidak akan berhasil selama 7 tahun

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

Pertama, hampir tidak mungkin membuat objek DateTime dengan
waktu saat ini DENGAN set mikrodetik (DateTime. createFromFormat('U. kamu',
sprintf('%. f', waktu mikro(benar)));
rumit untuk membuat objek DateTime tanpa mikrodetik
diinisialisasi/diset ke 0. Tanggal Waktu. buatDariFormat('U',

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
4);
Tanggal Waktu('@'.
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_4);

Ini sudah terjadi sejak 5. 3. 1. Anda tidak dapat memperdebatkan DateTime dengan serius
selalu memiliki presisi mikrodetik dan memperbaiki inisialisasi
hampir 7 tahun

DateTime memiliki cara yang tidak jelas untuk menginisialisasi dengan waktu saat ini
termasuk mikrodetik, __construct() default tidak menunjukkan tanda
dukungan mikrodetik. Mengubah perilaku ini 7 tahun setelah perkenalan
tidak bisa disebut perbaikan bug (apakah ini masuk ke 5. 6 dan 7. 0 juga?),
itu hanya fitur

Apakah Anda pernah meng-Google "situs mikrodetik. php. bersih/manual";?
Hanya dokumentasi (tidak termasuk komentar) tentang createFromFormat
menyebutkan 'mikrodetik'

Membuat asumsi DateTime mendukung microtime hanya akan didasarkan pada
detail internal yang tidak terdokumentasi. ITU akan menjadi asumsi yang buruk

Lihat https. //3v4l. org/aCRU0 dan https. //3v4l. org/4Oid8

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $cat doo2. php
$date = new DateTimeImmutable( "13. 39. 04. 123456" );
var_dump( $tanggal );
?>

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $php -n doo2. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 39. 04. 123456"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Alice Wonder — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

oleh Davey Shafik — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

Saya telah mendiskusikan hal ini dengan Joe, dan kami setuju dengan peringatan BC break;
yang lainnya tidak dianggap sebagai jeda BC

Kami pasti harus mendokumentasikan beberapa praktik terbaik seputar tanggal relatif,
e. g. menggunakan tengah malam, atau mengatur waktu secara eksplisit

Terima kasih,

  • Davey

oleh Nikita Nefedov — lihat sumber

belum dibaca

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu sangat
yang populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah membuat laporan
Untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,  
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Nikita,

https. //3v4l. org/YUhFF adalah untuk menunjukkan bahwa TIDAK mudah
atur mikrodetik ke nol. BUKAN untuk mendemonstrasikan DateTime("5 menit
yang lalu") == DateTime baru ("5 menit yang lalu")

DateTime baru ("5 menit yang lalu, 0 mikrodetik") memang menetapkan
mikrodetik ke nol (senang mengetahuinya) tetapi ini tidak berfungsi untuk 'sekarang'

Lihat https. //3v4l. org/8VE7W untuk DateTime baru ('sekarang, 0 mikrodetik');
Dan kode ini gagal <7. 1RC4

Arjen

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu adalah a
yang sangat populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah menghasilkan a
laporan untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime see
    https. //3v4l. org/YUhFF Metode setMicroseconds akan berguna dan/atau mendukung
    ke string relatif untuk menyetel mikrodetik ke 0 (seperti halnya tengah malam untuk
    H. i. s). Atau apakah saya melewatkan sesuatu?
  • Anda juga tidak dapat mengatur bagian detik atau menit saja,
    melalui setTime(). Mikrodetik hanyalah perpanjangan waktu
    bagian

  • Menggunakan "tengah malam" juga menyetel mikrodetik ke 0

    [PHP. 7. 1. 0-dev ] derick@whisky. ~ $cat /tmp/tengah malam. php
    $a = DateTimeImmutable baru();
    var_dump( $a );
    var_dump( $a->modifikasi( 'tengah malam' ) );
    ?>

    [PHP. 7. 1. 0-dev ] derick@whisky. ~ $php -n /tmp/tengah malam. php
    objek(DateTimeImmutable)#1 (3) {
    "tanggal"]=>
    trit(26) "2016-11-08 12. 01. 20. 023680"
    "timezone_type"]=>
    nt(3)
    "zona waktu"]=>
    trit(3) "UTC"
    }
    objek(DateTimeImmutable)#2 (3) {
    "tanggal"]=>
    trit(26) "2016-11-08 00. 00. 00. 000000"
    "timezone_type"]=>
    nt(3)
    "zona waktu"]=>
    trit(3) "UTC"
    }

  1. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?

Parameter ke-3 untuk fungsi yang mana?

Atau DateTimeWithMicroseconds kelas kedua?
tapi sangat jelas apa yang akan terjadi

Tapi itu akan menjadi duplikat. DateTime dan
Kelas DateTimeImmutable sudah mendukung mikrodetik. Menambahkan tambahan
kelas untuk mereka, hanya akan membingungkan

  1. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Menambahkan argumen baru tambahan dengan nilai default, bukan pemutusan BC

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime see
    https. //3v4l. org/YUhFF Metode setMicroseconds akan berguna dan/atau mendukung
    ke string relatif untuk menyetel mikrodetik ke 0 (seperti halnya tengah malam untuk
    H. i. s). Atau apakah saya melewatkan sesuatu?
  • Anda juga tidak dapat mengatur bagian detik atau menit saja,
    melalui setTime(). Mikrodetik hanyalah perpanjangan waktu
    bagian
  • Menggunakan "tengah malam" juga menyetel mikrodetik ke 0

DateTime baru ('sekarang tengah malam') jelas tidak akan berfungsi

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $cat /tmp/tengah malam. php
$a = DateTimeImmutable baru();
var_dump( $a );
var_dump( $a->modifikasi( 'tengah malam' ) );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $php -n /tmp/tengah malam. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 12. 01. 20. 023680"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(DateTimeImmutable)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 00. 00. 00. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

  1. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?

Parameter ke-3 untuk fungsi yang mana?

Dengan argumen ke-3 yang saya maksud adalah konstruktor
DateTime publik. __construct([ string $time = "sekarang" [, DateTimeZone
$zona waktu = NULL, [ $initialize_microseconds = false ]]] )

Ketika mikrodetik TIDAK ditentukan dalam $time, jangan atur kecuali
$initialize_microseconds benar

Atau DateTimeWithMicroseconds kelas kedua?
tapi sangat jelas apa yang akan terjadi

Tapi itu akan menjadi duplikat. DateTime dan
Kelas DateTimeImmutable sudah mendukung mikrodetik. Menambahkan tambahan
kelas untuk mereka, hanya akan membingungkan

  1. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Menambahkan argumen baru tambahan dengan nilai default, bukan pemutusan BC

Bersulang,
Derick

oleh Lester Caine — lihat sumber

belum dibaca

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki

beberapa isu
Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

Kami memiliki masalah yang sama ketika resolusi waktu dari Firebird
meningkat dari milidetik menjadi mikrodetik. Banyak kode itu
mengharapkan tidak ada waktu sub kedua mulai melanggar karena ekstra
detail. Perbaikannya adalah 'CURRENT_TIME [(presisi)]' tetapi kompromi pada
default menghasilkan CURRENT_TIMESTAMP. = CURRENT_DATE + CURRENT_TIME
kecuali jika Anda benar-benar menyetel ketepatan keduanya agar cocok

Di PHP itu sebenarnya bukan masalah karena data yang dikembalikan memiliki
untuk diubah menjadi string dan ibase. timestampformat menyaring
bagian pecahan pula, dan bahkan detik dapat dipangkas jika
sesuai, jadi format string 'default' akan menyelesaikan masalah
membandingkan data waktu dari berbagai sumber?

--Lester Caine - G8HFL

Kontak - http. // lsces. bersama. uk/wiki/?page=contact
L. S. Layanan Elektronik Caine - http. // lsces. bersama. inggris
EnquirySolve - http. //penyelesaian pertanyaan. com/
Lokakarya Model Insinyur Digital - http. //medw. bersama. inggris
Media Digital Pelangi - http. //rainbowdigitalmedia. bersama. inggris

oleh Dan Ackroyd — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Pemahaman saya adalah jika ini memengaruhi kode Anda, maka kode Anda
sudah memiliki asumsi buruk di dalamnya. Kode salah berasumsi
bahwa dua DateTime yang dihasilkan akan memiliki waktu yang sama
keduanya. *

Saya tidak sepenuhnya mengerti masalah apa yang ingin Anda selesaikan
diskusi ini. Tidak ada yang memaksa Anda untuk memperbarui ke PHP 7. 1
langsung;
asumsi buruk tentang waktu di DateTime yang dihasilkan sebelum Anda
tingkatkan ke PHP7. 1

tulis SjonHortensius

jika menghasilkan DateTime membutuhkan sekitar 4 μs (yang memang untuk saya), ini terjadi ~ 250. 000 kali
lebih sering

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu menghentikan Anda dari
mengabaikan kasus tepi dan pemrograman secara kebetulan. **

Saya menyadari bahwa memiliki rilis membuatnya lebih jelas bahwa kode rusak
rusak adalah hal yang menjengkelkan harus diperbaiki. tapi kode itu
sudah salah. Menunda fitur yang berguna, hanya untuk menghindari keharusan memperbaiki
kode yang tidak stabil bukanlah cara yang baik untuk melanjutkan proyek, imo

tulis dshafik

Saya pikir mikrodetik default ke 0 ketika tidak spesifik untuk string relatif adalah perilaku yang benar

Saya tidak berpikir itu terdengar seperti rencana yang bagus sama sekali. Saat membuat a
DateTime hingga

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_8 hanya
nilai tanggal diatur dari string input, sisa waktu diatur
sampai sekarang()

Bukankah memiliki mikrodetik berperilaku berbeda dengan yang lainnya
nilai waktu akan langsung menjadi bagian tambahan dari inkonsistensi
orang untuk menyesal?

Bersulang
Dan

  • Kode contoh yang tidak berfungsi dengan benar sekarang. Jika periode tidur adalah
    berkurang, menjadi kurang jelas bahwa kode tersebut rusak, tetapi memang demikian
    masih rusak

untuk ($i=0; $i<10; $i++) {
$dt1 = new DateTime('hari pertama bulan depan');
usleep(rand(0, 500000));
$dt2 = new DateTime('hari pertama bulan depan');

if ($dt1 == $dt2) {
    echo "Same\n";
}
else {
    echo "Different\n";
}

}

** Pemrograman secara Kebetulan -
https. //pragprog. com/the-pragmatic-programmer/extracts/coincidence

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena
    parameter ekstra (poin 3). SM istirahat
  2. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki
presisi mikrodetik sedangkan $fromDatabase tidak)

Di mana ini memiliki asumsi yang buruk?
memiliki presisi detik), dan sekarang gagal. Apakah itu asumsi yang buruk?
pikir itu hanya mundur tanpa cara yang baik untuk memperbaiki kode

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena ada yang hilang
metode setMicroseconds. Seseorang perlu memanggil setTime dengan jam yang diambil,
menit, detik atau setTimestamp($dt->format('U'))

"Hanya mengandalkan hal-hal yang dapat diandalkan. "

Arjen

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Pemahaman saya adalah jika ini memengaruhi kode Anda, maka kode Anda
sudah memiliki asumsi buruk di dalamnya. Kode salah berasumsi
bahwa dua DateTime yang dihasilkan akan memiliki waktu yang sama
keduanya. *

Saya tidak sepenuhnya mengerti masalah apa yang ingin Anda selesaikan
diskusi ini. Tidak ada yang memaksa Anda untuk memperbarui ke PHP 7. 1
langsung;
asumsi buruk tentang waktu di DateTime yang dihasilkan sebelum Anda
tingkatkan ke PHP7. 1

tulis SjonHortensius

jika menghasilkan DateTime membutuhkan sekitar 4 μs (yang memang untuk saya), ini terjadi ~ 250. 000 kali
lebih sering

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu menghentikan Anda dari
mengabaikan kasus tepi dan pemrograman secara kebetulan. **

Saya menyadari bahwa memiliki rilis membuatnya lebih jelas bahwa kode rusak
rusak adalah hal yang menjengkelkan harus diperbaiki. tapi kode itu
sudah salah. Menunda fitur yang berguna, hanya untuk menghindari keharusan memperbaiki
kode yang tidak stabil bukanlah cara yang baik untuk melanjutkan proyek, imo

tulis dshafik

Saya pikir mikrodetik default ke 0 ketika tidak spesifik untuk string relatif adalah perilaku yang benar

Saya tidak berpikir itu terdengar seperti rencana yang bagus sama sekali. Saat membuat a
DateTime hingga

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_8 hanya
nilai tanggal diatur dari string input, sisa waktu diatur
sampai sekarang()

Bukankah memiliki mikrodetik berperilaku berbeda dengan yang lainnya
nilai waktu akan langsung menjadi bagian tambahan dari inkonsistensi
orang untuk menyesal?

Bersulang
Dan

  • Kode contoh yang tidak berfungsi dengan benar sekarang. Jika periode tidur adalah
    berkurang, menjadi kurang jelas bahwa kode tersebut rusak, tetapi memang demikian
    masih rusak

untuk ($i=0; $i<10; $i++) {
$dt1 = new DateTime('hari pertama bulan depan');
usleep(rand(0, 500000));
$dt2 = new DateTime('hari pertama bulan depan');

if ($dt1 == $dt2) {
    echo "Same\n";
}
else {
    echo "Different\n";
}

}

** Pemrograman secara Kebetulan -
https. //pragprog. com/the-pragmatic-programmer/extracts/coincidence

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP: 5.6.28-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Strict Standards: Declaration of MyDate::setTime() should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…
_

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ cat doo2.php 
&lt;?php
$date = new DateTimeImmutable( "13:39:04.123456" );
var_dump( $date );
?>

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n doo2.php
object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:39:04.123456"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu berhenti
Anda dari mengabaikan kasus tepi dan pemrograman secara kebetulan

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

Menganggap serius berarti membaca pesan lengkap dan tidak
berfokus pada detail contoh (https. //3v4l. org/YUhFF menghadapi
masalah yang sama tanpa argumen konstruktor; . g. tidak mudah diatur
mikrodetik ke 0). Saya tidak pernah mengatakan kami menghadapi DateTime baru == baru
Masalah DateTime, tapi Dan memberikan pelajaran tentang asumsi yang buruk

Tidak ada komentar tentang tidak dapat menyetel microtime ke nol

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $ kucing doo. php
kelas MyDate memperluas DateTimeImmutable
{
fungsi setTime( $h, $i, $s )
{
kembali orang tua. setWaktu( $h, $i + 5, $s );
}
}

$a = new MyDate();
$b = $a->setWaktu( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $php -n doo. php

Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL, $mikrodetik = NULL) di /tmp/doo. php pada baris 9
objek(TanggalKu)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 30. 06. 371428"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(TanggalKu)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 02. 10. 10. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP. 5. 6. 28-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Standar Ketat. Deklarasi MyDate. setTime() harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

Saya pikir itu TIDAK melanggar (dan karenanya peringatan) LSP. Jika Anda LAKUKAN menggunakan
Argumen mikrodetik ke-4 dalam aplikasi Anda, Anda tidak dapat mengganti a
objek DateTime dengan CustomDate yang tidak memiliki argumen ke-4 ini,
bahkan DateTime yang tangguh memiliki nilai default untuk itu. Jika Anda ingin menyimpan a
waktu dengan mikrodetik dengan setTime, Anda berakhir tanpa mikrodetik jika
Anda mengganti DateTime dengan CustomDate

"[. ] jika S adalah subtipe dari T, maka objek bertipe T dapat diganti
dengan objek bertipe S (i. e. , objek bertipe T dapat diganti
dengan objek subtipenya dari tipe S) tanpa mengubah salah satu dari
properti yang diinginkan dari program itu (kebenaran, tugas yang dilakukan, dll. )"

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Ini dulu bekerja selama 7 tahun, dan sekarang tidak. Jika saya tidak disimpan
detik, itu tidak akan berhasil selama 7 tahun

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

Pertama, hampir tidak mungkin membuat objek DateTime dengan
waktu saat ini DENGAN set mikrodetik (DateTime. createFromFormat('U. kamu',
sprintf('%. f', waktu mikro(benar)));
rumit untuk membuat objek DateTime tanpa mikrodetik
diinisialisasi/diset ke 0. Tanggal Waktu. buatDariFormat('U',

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
4);
Tanggal Waktu('@'.
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_4);

Ini sudah terjadi sejak 5. 3. 1. Anda tidak dapat memperdebatkan DateTime dengan serius
selalu memiliki presisi mikrodetik dan memperbaiki inisialisasi
hampir 7 tahun

DateTime memiliki cara yang tidak jelas untuk menginisialisasi dengan waktu saat ini
termasuk mikrodetik, __construct() default tidak menunjukkan tanda
dukungan mikrodetik. Mengubah perilaku ini 7 tahun setelah perkenalan
tidak bisa disebut perbaikan bug (apakah ini masuk ke 5. 6 dan 7. 0 juga?),
itu hanya fitur

Apakah Anda pernah meng-Google "situs mikrodetik. php. bersih/manual";?
Hanya dokumentasi (tidak termasuk komentar) tentang createFromFormat
menyebutkan 'mikrodetik'

Membuat asumsi DateTime mendukung microtime hanya akan didasarkan pada
detail internal yang tidak terdokumentasi. ITU akan menjadi asumsi yang buruk

Lihat https. //3v4l. org/aCRU0 dan https. //3v4l. org/4Oid8

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $cat doo2. php
$date = new DateTimeImmutable( "13. 39. 04. 123456" );
var_dump( $tanggal );
?>

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $php -n doo2. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 39. 04. 123456"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Alice Wonder — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

oleh Davey Shafik — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

Saya telah mendiskusikan hal ini dengan Joe, dan kami setuju dengan peringatan BC break;
yang lainnya tidak dianggap sebagai jeda BC

Kami pasti harus mendokumentasikan beberapa praktik terbaik seputar tanggal relatif,
e. g. menggunakan tengah malam, atau mengatur waktu secara eksplisit

Terima kasih,

  • Davey

oleh Nikita Nefedov — lihat sumber

belum dibaca

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu sangat
yang populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah membuat laporan
Untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,  
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Nikita,

https. //3v4l. org/YUhFF adalah untuk menunjukkan bahwa TIDAK mudah
atur mikrodetik ke nol. BUKAN untuk mendemonstrasikan DateTime("5 menit
yang lalu") == DateTime baru ("5 menit yang lalu")

DateTime baru ("5 menit yang lalu, 0 mikrodetik") memang menetapkan
mikrodetik ke nol (senang mengetahuinya) tetapi ini tidak berfungsi untuk 'sekarang'

Lihat https. //3v4l. org/8VE7W untuk DateTime baru ('sekarang, 0 mikrodetik');
Dan kode ini gagal <7. 1RC4

Arjen

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu adalah a
yang sangat populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah menghasilkan a
laporan untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena
    parameter ekstra (poin 3). SM istirahat
  2. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki
presisi mikrodetik sedangkan $fromDatabase tidak)

Di mana ini memiliki asumsi yang buruk?
memiliki presisi detik), dan sekarang gagal. Apakah itu asumsi yang buruk?
pikir itu hanya mundur tanpa cara yang baik untuk memperbaiki kode

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena ada yang hilang
metode setMicroseconds. Seseorang perlu memanggil setTime dengan jam yang diambil,
menit, detik atau setTimestamp($dt->format('U'))

"Hanya mengandalkan hal-hal yang dapat diandalkan. "

Arjen

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Pemahaman saya adalah jika ini memengaruhi kode Anda, maka kode Anda
sudah memiliki asumsi buruk di dalamnya. Kode salah berasumsi
bahwa dua DateTime yang dihasilkan akan memiliki waktu yang sama
keduanya. *

Saya tidak sepenuhnya mengerti masalah apa yang ingin Anda selesaikan
diskusi ini. Tidak ada yang memaksa Anda untuk memperbarui ke PHP 7. 1
langsung;
asumsi buruk tentang waktu di DateTime yang dihasilkan sebelum Anda
tingkatkan ke PHP7. 1

tulis SjonHortensius

jika menghasilkan DateTime membutuhkan sekitar 4 μs (yang memang untuk saya), ini terjadi ~ 250. 000 kali
lebih sering

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu menghentikan Anda dari
mengabaikan kasus tepi dan pemrograman secara kebetulan. **

Saya menyadari bahwa memiliki rilis membuatnya lebih jelas bahwa kode rusak
rusak adalah hal yang menjengkelkan harus diperbaiki. tapi kode itu
sudah salah. Menunda fitur yang berguna, hanya untuk menghindari keharusan memperbaiki
kode yang tidak stabil bukanlah cara yang baik untuk melanjutkan proyek, imo

tulis dshafik

Saya pikir mikrodetik default ke 0 ketika tidak spesifik untuk string relatif adalah perilaku yang benar

Saya tidak berpikir itu terdengar seperti rencana yang bagus sama sekali. Saat membuat a
DateTime hingga

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_8 hanya
nilai tanggal diatur dari string input, sisa waktu diatur
sampai sekarang()

Bukankah memiliki mikrodetik berperilaku berbeda dengan yang lainnya
nilai waktu akan langsung menjadi bagian tambahan dari inkonsistensi
orang untuk menyesal?

Bersulang
Dan

  • Kode contoh yang tidak berfungsi dengan benar sekarang. Jika periode tidur adalah
    berkurang, menjadi kurang jelas bahwa kode tersebut rusak, tetapi memang demikian
    masih rusak

untuk ($i=0; $i<10; $i++) {
$dt1 = new DateTime('hari pertama bulan depan');
usleep(rand(0, 500000));
$dt2 = new DateTime('hari pertama bulan depan');

if ($dt1 == $dt2) {
    echo "Same\n";
}
else {
    echo "Different\n";
}

}

** Pemrograman secara Kebetulan -
https. //pragprog. com/the-pragmatic-programmer/extracts/coincidence

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP: 5.6.28-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Strict Standards: Declaration of MyDate::setTime() should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…
_

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ cat doo2.php 
&lt;?php
$date = new DateTimeImmutable( "13:39:04.123456" );
var_dump( $date );
?>

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n doo2.php
object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:39:04.123456"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu berhenti
Anda dari mengabaikan kasus tepi dan pemrograman secara kebetulan

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

Menganggap serius berarti membaca pesan lengkap dan tidak
berfokus pada detail contoh (https. //3v4l. org/YUhFF menghadapi
masalah yang sama tanpa argumen konstruktor; . g. tidak mudah diatur
mikrodetik ke 0). Saya tidak pernah mengatakan kami menghadapi DateTime baru == baru
Masalah DateTime, tapi Dan memberikan pelajaran tentang asumsi yang buruk

Tidak ada komentar tentang tidak dapat menyetel microtime ke nol

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $ kucing doo. php
kelas MyDate memperluas DateTimeImmutable
{
fungsi setTime( $h, $i, $s )
{
kembali orang tua. setWaktu( $h, $i + 5, $s );
}
}

$a = new MyDate();
$b = $a->setWaktu( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $php -n doo. php

Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL, $mikrodetik = NULL) di /tmp/doo. php pada baris 9
objek(TanggalKu)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 30. 06. 371428"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(TanggalKu)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 02. 10. 10. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP. 5. 6. 28-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Standar Ketat. Deklarasi MyDate. setTime() harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

Saya pikir itu TIDAK melanggar (dan karenanya peringatan) LSP. Jika Anda LAKUKAN menggunakan
Argumen mikrodetik ke-4 dalam aplikasi Anda, Anda tidak dapat mengganti a
objek DateTime dengan CustomDate yang tidak memiliki argumen ke-4 ini,
bahkan DateTime yang tangguh memiliki nilai default untuk itu. Jika Anda ingin menyimpan a
waktu dengan mikrodetik dengan setTime, Anda berakhir tanpa mikrodetik jika
Anda mengganti DateTime dengan CustomDate

"[. ] jika S adalah subtipe dari T, maka objek bertipe T dapat diganti
dengan objek bertipe S (i. e. , objek bertipe T dapat diganti
dengan objek subtipenya dari tipe S) tanpa mengubah salah satu dari
properti yang diinginkan dari program itu (kebenaran, tugas yang dilakukan, dll. )"

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Ini dulu bekerja selama 7 tahun, dan sekarang tidak. Jika saya tidak disimpan
detik, itu tidak akan berhasil selama 7 tahun

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

Pertama, hampir tidak mungkin membuat objek DateTime dengan
waktu saat ini DENGAN set mikrodetik (DateTime. createFromFormat('U. kamu',
sprintf('%. f', waktu mikro(benar)));
rumit untuk membuat objek DateTime tanpa mikrodetik
diinisialisasi/diset ke 0. Tanggal Waktu. buatDariFormat('U',

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
4);
Tanggal Waktu('@'.
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_4);

Ini sudah terjadi sejak 5. 3. 1. Anda tidak dapat memperdebatkan DateTime dengan serius
selalu memiliki presisi mikrodetik dan memperbaiki inisialisasi
hampir 7 tahun

DateTime memiliki cara yang tidak jelas untuk menginisialisasi dengan waktu saat ini
termasuk mikrodetik, __construct() default tidak menunjukkan tanda
dukungan mikrodetik. Mengubah perilaku ini 7 tahun setelah perkenalan
tidak bisa disebut perbaikan bug (apakah ini masuk ke 5. 6 dan 7. 0 juga?),
itu hanya fitur

Apakah Anda pernah meng-Google "situs mikrodetik. php. bersih/manual";?
Hanya dokumentasi (tidak termasuk komentar) tentang createFromFormat
menyebutkan 'mikrodetik'

Membuat asumsi DateTime mendukung microtime hanya akan didasarkan pada
detail internal yang tidak terdokumentasi. ITU akan menjadi asumsi yang buruk

Lihat https. //3v4l. org/aCRU0 dan https. //3v4l. org/4Oid8

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $cat doo2. php
$date = new DateTimeImmutable( "13. 39. 04. 123456" );
var_dump( $tanggal );
?>

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $php -n doo2. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 39. 04. 123456"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Alice Wonder — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

oleh Davey Shafik — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

Saya telah mendiskusikan hal ini dengan Joe, dan kami setuju dengan peringatan BC break;
yang lainnya tidak dianggap sebagai jeda BC

Kami pasti harus mendokumentasikan beberapa praktik terbaik seputar tanggal relatif,
e. g. menggunakan tengah malam, atau mengatur waktu secara eksplisit

Terima kasih,

  • Davey

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

> Having bugs happen more frequently is a good thing. It stops 
> you from ignoring edge cases and programming by coincidence.
_

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP: 5.6.28-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Strict Standards: Declaration of MyDate::setTime() should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n -derror_reporting=-1 -ddate.timezone=UTC /tmp/doo.php 
Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL) in /tmp/doo.php on line 9
…
_

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ cat doo2.php 
&lt;?php
$date = new DateTimeImmutable( "13:39:04.123456" );
var_dump( $date );
?>

[PHP: 7.0.13-dev  ] derick@whisky:~/dev/php/php-src.git $ php -n doo2.php
object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:39:04.123456"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu berhenti
Anda dari mengabaikan kasus tepi dan pemrograman secara kebetulan

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

Menganggap serius berarti membaca pesan lengkap dan tidak
berfokus pada detail contoh (https. //3v4l. org/YUhFF menghadapi
masalah yang sama tanpa argumen konstruktor; . g. tidak mudah diatur
mikrodetik ke 0). Saya tidak pernah mengatakan kami menghadapi DateTime baru == baru
Masalah DateTime, tapi Dan memberikan pelajaran tentang asumsi yang buruk

Tidak ada komentar tentang tidak dapat menyetel microtime ke nol

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $ kucing doo. php
kelas MyDate memperluas DateTimeImmutable
{
fungsi setTime( $h, $i, $s )
{
kembali orang tua. setWaktu( $h, $i + 5, $s );
}
}

$a = new MyDate();
$b = $a->setWaktu( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $php -n doo. php

Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL, $mikrodetik = NULL) di /tmp/doo. php pada baris 9
objek(TanggalKu)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 30. 06. 371428"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(TanggalKu)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 02. 10. 10. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP. 5. 6. 28-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Standar Ketat. Deklarasi MyDate. setTime() harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

Saya pikir itu TIDAK melanggar (dan karenanya peringatan) LSP. Jika Anda LAKUKAN menggunakan
Argumen mikrodetik ke-4 dalam aplikasi Anda, Anda tidak dapat mengganti a
objek DateTime dengan CustomDate yang tidak memiliki argumen ke-4 ini,
bahkan DateTime yang tangguh memiliki nilai default untuk itu. Jika Anda ingin menyimpan a
waktu dengan mikrodetik dengan setTime, Anda berakhir tanpa mikrodetik jika
Anda mengganti DateTime dengan CustomDate

"[. ] jika S adalah subtipe dari T, maka objek bertipe T dapat diganti
dengan objek bertipe S (i. e. , objek bertipe T dapat diganti
dengan objek subtipenya dari tipe S) tanpa mengubah salah satu dari
properti yang diinginkan dari program itu (kebenaran, tugas yang dilakukan, dll. )"

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Ini dulu bekerja selama 7 tahun, dan sekarang tidak. Jika saya tidak disimpan
detik, itu tidak akan berhasil selama 7 tahun

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

Pertama, hampir tidak mungkin membuat objek DateTime dengan
waktu saat ini DENGAN set mikrodetik (DateTime. createFromFormat('U. kamu',
sprintf('%. f', waktu mikro(benar)));
rumit untuk membuat objek DateTime tanpa mikrodetik
diinisialisasi/diset ke 0. Tanggal Waktu. buatDariFormat('U',

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
4);
Tanggal Waktu('@'.
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_4);

Ini sudah terjadi sejak 5. 3. 1. Anda tidak dapat memperdebatkan DateTime dengan serius
selalu memiliki presisi mikrodetik dan memperbaiki inisialisasi
hampir 7 tahun

DateTime memiliki cara yang tidak jelas untuk menginisialisasi dengan waktu saat ini
termasuk mikrodetik, __construct() default tidak menunjukkan tanda
dukungan mikrodetik. Mengubah perilaku ini 7 tahun setelah perkenalan
tidak bisa disebut perbaikan bug (apakah ini masuk ke 5. 6 dan 7. 0 juga?),
itu hanya fitur

Apakah Anda pernah meng-Google "situs mikrodetik. php. bersih/manual";?
Hanya dokumentasi (tidak termasuk komentar) tentang createFromFormat
menyebutkan 'mikrodetik'

Membuat asumsi DateTime mendukung microtime hanya akan didasarkan pada
detail internal yang tidak terdokumentasi. ITU akan menjadi asumsi yang buruk

Lihat https. //3v4l. org/aCRU0 dan https. //3v4l. org/4Oid8

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $cat doo2. php
$date = new DateTimeImmutable( "13. 39. 04. 123456" );
var_dump( $tanggal );
?>

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $php -n doo2. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 39. 04. 123456"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Saya pikir Anda membuat beberapa asumsi buruk di sini

Tolong jangan top-reply pada daftar ini

Contoh yang diberikan oleh Sjon adalah
skrip dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk, tetapi kehidupan nyata
contoh penggunaan DateTime. Dan mereka akan hancur

Mereka sudah bisa istirahat. Sebagai Dan menulis lebih baik

Memiliki bug lebih sering terjadi adalah hal yang baik. Itu berhenti
Anda dari mengabaikan kasus tepi dan pemrograman secara kebetulan

Kami memiliki dua masalah dalam basis kode kami. Kami sedang menguji rilis RC, saya pikir
umpan balik harus ditanggapi dengan serius

Menganggap serius bukan berarti harus setuju

Menganggap serius berarti membaca pesan lengkap dan tidak
berfokus pada detail contoh (https. //3v4l. org/YUhFF menghadapi
masalah yang sama tanpa argumen konstruktor; . g. tidak mudah diatur
mikrodetik ke 0). Saya tidak pernah mengatakan kami menghadapi DateTime baru == baru
Masalah DateTime, tapi Dan memberikan pelajaran tentang asumsi yang buruk

Tidak ada komentar tentang tidak dapat menyetel microtime ke nol

  1. Kami membebani DateTime. setTime, ini membutuhkan pembaruan karena tambahan
    parameter (poin 3). SM istirahat

PHP memberikan peringatan di sini, tetapi hasil kode yang diharapkan
eksekusi sudah benar

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $ kucing doo. php
kelas MyDate memperluas DateTimeImmutable
{
fungsi setTime( $h, $i, $s )
{
kembali orang tua. setWaktu( $h, $i + 5, $s );
}
}

$a = new MyDate();
$b = $a->setWaktu( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. /tmp $php -n doo. php

Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL, $mikrodetik = NULL) di /tmp/doo. php pada baris 9
objek(TanggalKu)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 30. 06. 371428"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(TanggalKu)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 02. 10. 10. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Ini paling banyak merupakan jeda BC karena ini menunjukkan peringatan. Kode itu sendiri tidak rusak

Di PHP5. 6, ini adalah peringatan

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_0, yang diubah menjadi
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
1 di PHP 7. 0

[PHP. 5. 6. 28-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Standar Ketat. Deklarasi MyDate. setTime() harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $ php -n -derror_reporting=-1 -ddate. zona waktu=UTC /tmp/doo. php
Peringatan. Deklarasi MyDate. setTime($h, $i, $s) harus kompatibel dengan DateTimeImmutable. setTime($jam, $menit, $detik = NULL) di /tmp/doo. php pada baris 9

Karena kelebihan muatan khusus ini tidak melanggar Pergantian Liskov
Prinsipnya, saya berpendapat bahwa peringatan inilah yang merupakan pemutusan BC di PHP
7. 0, dan bukan penambahan nilai argumen-dengan-default-ekstra

Saya pikir itu TIDAK melanggar (dan karenanya peringatan) LSP. Jika Anda LAKUKAN menggunakan
Argumen mikrodetik ke-4 dalam aplikasi Anda, Anda tidak dapat mengganti a
objek DateTime dengan CustomDate yang tidak memiliki argumen ke-4 ini,
bahkan DateTime yang tangguh memiliki nilai default untuk itu. Jika Anda ingin menyimpan a
waktu dengan mikrodetik dengan setTime, Anda berakhir tanpa mikrodetik jika
Anda mengganti DateTime dengan CustomDate

"[. ] jika S adalah subtipe dari T, maka objek bertipe T dapat diganti
dengan objek bertipe S (i. e. , objek bertipe T dapat diganti
dengan objek subtipenya dari tipe S) tanpa mengubah salah satu dari
properti yang diinginkan dari program itu (kebenaran, tugas yang dilakukan, dll. )"

  1. Kami menguji yang berikut ini

A. $tanggal = TanggalWaktu baru;
B. Simpan di basis data
C. Ambil datetime
D. $fromDatabase = new DateTime(storedDateTime);
E. $fromDatabase == $date (yang gagal sekarang, karena $date memiliki microsecond
presisi sementara $fromDatabase tidak)

Jika Anda tidak menyimpan mikrodetik dalam database, saya kira tidak
bekerja. Ini seperti jika Anda tidak menyimpan detik di database, itu
Anda juga tidak akan mendapatkan hasil yang sama

Ini dulu bekerja selama 7 tahun, dan sekarang tidak. Jika saya tidak disimpan
detik, itu tidak akan berhasil selama 7 tahun

Di mana ini memiliki asumsi yang buruk?
detik presisi), dan sekarang gagal. Apakah itu asumsi yang buruk?
hanya mundur tanpa cara yang baik untuk memperbaiki kode

Asumsi buruknya adalah, bahwa DateTime selalu memiliki mikrodetik
presisi, dan bug yang diperbaiki adalah, yang tidak selalu mereka dapatkan
diinisialisasi dengan benar

Pertama, hampir tidak mungkin membuat objek DateTime dengan
waktu saat ini DENGAN set mikrodetik (DateTime. createFromFormat('U. kamu',
sprintf('%. f', waktu mikro(benar)));
rumit untuk membuat objek DateTime tanpa mikrodetik
diinisialisasi/diset ke 0. Tanggal Waktu. buatDariFormat('U',

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
4);
Tanggal Waktu('@'.
[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_4);

Ini sudah terjadi sejak 5. 3. 1. Anda tidak dapat memperdebatkan DateTime dengan serius
selalu memiliki presisi mikrodetik dan memperbaiki inisialisasi
hampir 7 tahun

DateTime memiliki cara yang tidak jelas untuk menginisialisasi dengan waktu saat ini
termasuk mikrodetik, __construct() default tidak menunjukkan tanda
dukungan mikrodetik. Mengubah perilaku ini 7 tahun setelah perkenalan
tidak bisa disebut perbaikan bug (apakah ini masuk ke 5. 6 dan 7. 0 juga?),
itu hanya fitur

Apakah Anda pernah meng-Google "situs mikrodetik. php. bersih/manual";?
Hanya dokumentasi (tidak termasuk komentar) tentang createFromFormat
menyebutkan 'mikrodetik'

Membuat asumsi DateTime mendukung microtime hanya akan didasarkan pada
detail internal yang tidak terdokumentasi. ITU akan menjadi asumsi yang buruk

Lihat https. //3v4l. org/aCRU0 dan https. //3v4l. org/4Oid8

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $cat doo2. php
$date = new DateTimeImmutable( "13. 39. 04. 123456" );
var_dump( $tanggal );
?>

[PHP. 7. 0. 13-dev ] derick@whisky. ~/dev/php/php-src. git $php -n doo2. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 13. 39. 04. 123456"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

Kita dapat menyetel mikrodetik ke 0, yang tidak praktis karena a
metode setMicroseconds hilang. Seseorang perlu memanggil setTime dengan
diambil jam, menit, detik atau setTimestamp($dt->format('U'))

Karena Anda membebani kelas DateTime, itu hanya minor
ketidaknyamanan

Bersulang,
Derick

oleh Alice Wonder — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

oleh Davey Shafik — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

Saya telah mendiskusikan hal ini dengan Joe, dan kami setuju dengan peringatan BC break;
yang lainnya tidak dianggap sebagai jeda BC

Kami pasti harus mendokumentasikan beberapa praktik terbaik seputar tanggal relatif,
e. g. menggunakan tengah malam, atau mengatur waktu secara eksplisit

Terima kasih,

  • Davey

oleh Davey Shafik — lihat sumber

belum dibaca

Hai Dan,

Saya pikir Anda membuat beberapa asumsi buruk di sini. Contoh yang diberikan oleh
Sjon adalah skrip yang dikirimkan ke 3v4l. org Mereka mungkin memiliki asumsi yang buruk,
tetapi merupakan contoh kehidupan nyata dari penggunaan DateTime. Dan mereka akan hancur

Mereka sudah rusak. Itulah intinya

Jarang pemicu kerusakan saat ini tetapi akan memicu

Secara pribadi saya lebih suka ketika kode buruk jelas memicu, itu bisa sangat
sulit (baca mahal) untuk melacak bug dalam kode yang jarang dan
pemicu secara acak

Saya telah mendiskusikan hal ini dengan Joe, dan kami setuju dengan peringatan BC break;
yang lainnya tidak dianggap sebagai jeda BC

Kami pasti harus mendokumentasikan beberapa praktik terbaik seputar tanggal relatif,
e. g. menggunakan tengah malam, atau mengatur waktu secara eksplisit

Terima kasih,

  • Davey

oleh Nikita Nefedov — lihat sumber

belum dibaca

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu sangat
yang populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah membuat laporan
Untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,  
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Nikita,

https. //3v4l. org/YUhFF adalah untuk menunjukkan bahwa TIDAK mudah
atur mikrodetik ke nol. BUKAN untuk mendemonstrasikan DateTime("5 menit
yang lalu") == DateTime baru ("5 menit yang lalu")

DateTime baru ("5 menit yang lalu, 0 mikrodetik") memang menetapkan
mikrodetik ke nol (senang mengetahuinya) tetapi ini tidak berfungsi untuk 'sekarang'

Lihat https. //3v4l. org/8VE7W untuk DateTime baru ('sekarang, 0 mikrodetik');
Dan kode ini gagal <7. 1RC4

Arjen

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu adalah a
yang sangat populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah menghasilkan a
laporan untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Arjen Schol — lihat sumber

belum dibaca

Hai Nikita,

https. //3v4l. org/YUhFF adalah untuk menunjukkan bahwa TIDAK mudah
atur mikrodetik ke nol. BUKAN untuk mendemonstrasikan DateTime("5 menit
yang lalu") == DateTime baru ("5 menit yang lalu")

DateTime baru ("5 menit yang lalu, 0 mikrodetik") memang menetapkan
mikrodetik ke nol (senang mengetahuinya) tetapi ini tidak berfungsi untuk 'sekarang'

Lihat https. //3v4l. org/8VE7W untuk DateTime baru ('sekarang, 0 mikrodetik');
Dan kode ini gagal <7. 1RC4

Arjen

Hei Arjen,

Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime

Sebenarnya ada cara mudah, Anda bisa melewati nilai absolut mikrodetik
di konstruktor juga, itu akan seperti.

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
_6

Seperti yang Dan katakan itu mungkin kesalahan dalam kode, sungguh, dan itu adalah a
yang sangat populer,
untuk berpikir bahwa

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ cat doo.php 
&lt;?php
class MyDate extends DateTimeImmutable
{
	function setTime( $h, $i, $s )
	{
		return parent::setTime( $h, $i + 5, $s );
	}
}

$a = new MyDate();
$b = $a->setTime( 2, 5, 10 );

var_dump( $a, $b );
?>

[PHP: 7.1.0-dev  ] derick@whisky:/tmp $ php -n doo.php

Warning: Declaration of MyDate::setTime($h, $i, $s) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in /tmp/doo.php on line 9
object(MyDate)#1 (3) {
  ["date"]=>
  string(26) "2016-11-08 13:30:06.371428"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(MyDate)#2 (3) {
  ["date"]=>
  string(26) "2016-11-08 02:10:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
7
Jika Anda mengambil sampelnya cukup banyak bahkan pada versi pra-7 PHP, Anda akan mendapatkannya
ketidaksetaraan juga. https. //3v4l. org/JV59e (maaf karena kelebihan muatan 3v4l a
sedikit di sini)
Ini terutama merupakan kesalahan yang tidak diinginkan karena menyebabkan kegagalan
secara acak,
tidak ada yang suka test suite mereka gagal / kadang-kadang /, itu membuat debugging
pengalaman yang sangat tidak menyenangkan

Saat melakukan manipulasi tanggal, katakanlah tugasnya adalah menghasilkan a
laporan untuk
bulan sebelumnya, Anda harus selalu memiliki tanggal dasar sebagai titik
referensi

$startDate = new DateTimeImmutable("first day of previous month,
00:00:00.0");
$endDate = $startDate->add(new DateInterval("P1M"));

oleh Derick Rethans — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime see
    https. //3v4l. org/YUhFF Metode setMicroseconds akan berguna dan/atau mendukung
    ke string relatif untuk menyetel mikrodetik ke 0 (seperti halnya tengah malam untuk
    H. i. s). Atau apakah saya melewatkan sesuatu?
  • Anda juga tidak dapat mengatur bagian detik atau menit saja,
    melalui setTime(). Mikrodetik hanyalah perpanjangan waktu
    bagian

  • Menggunakan "tengah malam" juga menyetel mikrodetik ke 0

    [PHP. 7. 1. 0-dev ] derick@whisky. ~ $cat /tmp/tengah malam. php
    $a = DateTimeImmutable baru();
    var_dump( $a );
    var_dump( $a->modifikasi( 'tengah malam' ) );
    ?>

    [PHP. 7. 1. 0-dev ] derick@whisky. ~ $php -n /tmp/tengah malam. php
    objek(DateTimeImmutable)#1 (3) {
    "tanggal"]=>
    trit(26) "2016-11-08 12. 01. 20. 023680"
    "timezone_type"]=>
    nt(3)
    "zona waktu"]=>
    trit(3) "UTC"
    }
    objek(DateTimeImmutable)#2 (3) {
    "tanggal"]=>
    trit(26) "2016-11-08 00. 00. 00. 000000"
    "timezone_type"]=>
    nt(3)
    "zona waktu"]=>
    trit(3) "UTC"
    }

  1. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?

Parameter ke-3 untuk fungsi yang mana?

Atau DateTimeWithMicroseconds kelas kedua?
tapi sangat jelas apa yang akan terjadi

Tapi itu akan menjadi duplikat. DateTime dan
Kelas DateTimeImmutable sudah mendukung mikrodetik. Menambahkan tambahan
kelas untuk mereka, hanya akan membingungkan

  1. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Menambahkan argumen baru tambahan dengan nilai default, bukan pemutusan BC

Bersulang,
Derick

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime see
    https. //3v4l. org/YUhFF Metode setMicroseconds akan berguna dan/atau mendukung
    ke string relatif untuk menyetel mikrodetik ke 0 (seperti halnya tengah malam untuk
    H. i. s). Atau apakah saya melewatkan sesuatu?
  • Anda juga tidak dapat mengatur bagian detik atau menit saja,
    melalui setTime(). Mikrodetik hanyalah perpanjangan waktu
    bagian
  • Menggunakan "tengah malam" juga menyetel mikrodetik ke 0

DateTime baru ('sekarang tengah malam') jelas tidak akan berfungsi

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $cat /tmp/tengah malam. php
$a = DateTimeImmutable baru();
var_dump( $a );
var_dump( $a->modifikasi( 'tengah malam' ) );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $php -n /tmp/tengah malam. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 12. 01. 20. 023680"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(DateTimeImmutable)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 00. 00. 00. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

  1. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?

Parameter ke-3 untuk fungsi yang mana?

Dengan argumen ke-3 yang saya maksud adalah konstruktor
DateTime publik. __construct([ string $time = "sekarang" [, DateTimeZone
$zona waktu = NULL, [ $initialize_microseconds = false ]]] )

Ketika mikrodetik TIDAK ditentukan dalam $time, jangan atur kecuali
$initialize_microseconds benar

Atau DateTimeWithMicroseconds kelas kedua?
tapi sangat jelas apa yang akan terjadi

Tapi itu akan menjadi duplikat. DateTime dan
Kelas DateTimeImmutable sudah mendukung mikrodetik. Menambahkan tambahan
kelas untuk mereka, hanya akan membingungkan

  1. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Menambahkan argumen baru tambahan dengan nilai default, bukan pemutusan BC

Bersulang,
Derick

oleh Lester Caine — lihat sumber

belum dibaca

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki

beberapa isu
Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

Kami memiliki masalah yang sama ketika resolusi waktu dari Firebird
meningkat dari milidetik menjadi mikrodetik. Banyak kode itu
mengharapkan tidak ada waktu sub kedua mulai melanggar karena ekstra
detail. Perbaikannya adalah 'CURRENT_TIME [(presisi)]' tetapi kompromi pada
default menghasilkan CURRENT_TIMESTAMP. = CURRENT_DATE + CURRENT_TIME
kecuali jika Anda benar-benar menyetel ketepatan keduanya agar cocok

Di PHP itu sebenarnya bukan masalah karena data yang dikembalikan memiliki
untuk diubah menjadi string dan ibase. timestampformat menyaring
bagian pecahan pula, dan bahkan detik dapat dipangkas jika
sesuai, jadi format string 'default' akan menyelesaikan masalah
membandingkan data waktu dari berbagai sumber?

--Lester Caine - G8HFL

Kontak - http. // lsces. bersama. uk/wiki/?page=contact
L. S. Layanan Elektronik Caine - http. // lsces. bersama. inggris
EnquirySolve - http. //penyelesaian pertanyaan. com/
Lokakarya Model Insinyur Digital - http. //medw. bersama. inggris
Media Digital Pelangi - http. //rainbowdigitalmedia. bersama. inggris

oleh Arjen Schol — lihat sumber

belum dibaca

Hai,

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki
beberapa isu

Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

  1. Tidak ada cara mudah untuk menyetel mikrodetik ke 0, Anda harus memanggil setTime see
    https. //3v4l. org/YUhFF Metode setMicroseconds akan berguna dan/atau mendukung
    ke string relatif untuk menyetel mikrodetik ke 0 (seperti halnya tengah malam untuk
    H. i. s). Atau apakah saya melewatkan sesuatu?
  • Anda juga tidak dapat mengatur bagian detik atau menit saja,
    melalui setTime(). Mikrodetik hanyalah perpanjangan waktu
    bagian
  • Menggunakan "tengah malam" juga menyetel mikrodetik ke 0

DateTime baru ('sekarang tengah malam') jelas tidak akan berfungsi

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $cat /tmp/tengah malam. php
$a = DateTimeImmutable baru();
var_dump( $a );
var_dump( $a->modifikasi( 'tengah malam' ) );
?>

[PHP. 7. 1. 0-dev ] derick@whisky. ~ $php -n /tmp/tengah malam. php
objek(DateTimeImmutable)#1 (3) {
["tanggal"]=>
string(26) "2016-11-08 12. 01. 20. 023680"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}
objek(DateTimeImmutable)#2 (3) {
["tanggal"]=>
string(26) "2016-11-08 00. 00. 00. 000000"
["timezone_type"]=>
int(3)
["zona waktu"]=>
string(3) "UTC"
}

  1. Dukungan mikrodetik berguna, menurut saya bukan secara default. Kenapa tidak
    perkenalkan parameter ke-3 $with_microseconds/$set_microseconds yang
    default ke salah?

Parameter ke-3 untuk fungsi yang mana?

Dengan argumen ke-3 yang saya maksud adalah konstruktor
DateTime publik. __construct([ string $time = "sekarang" [, DateTimeZone
$zona waktu = NULL, [ $initialize_microseconds = false ]]] )

Ketika mikrodetik TIDAK ditentukan dalam $time, jangan atur kecuali
$initialize_microseconds benar

Atau DateTimeWithMicroseconds kelas kedua?
tapi sangat jelas apa yang akan terjadi

Tapi itu akan menjadi duplikat. DateTime dan
Kelas DateTimeImmutable sudah mendukung mikrodetik. Menambahkan tambahan
kelas untuk mereka, hanya akan membingungkan

  1. Parameter ke-4 untuk setTime() seharusnya tidak menyebabkan kerusakan BC

Menambahkan argumen baru tambahan dengan nilai default, bukan pemutusan BC

Bersulang,
Derick

oleh Lester Caine — lihat sumber

belum dibaca

Dukungan untuk mikrodetik ditambahkan di akhir 7. 1 siklus RC, namun memiliki

beberapa isu
Beberapa dukungan tambahan untuk mikrodetik ditambahkan di PHP 7. 1
siklus, sebagian besar untuk mendukung perbaikan bug yang telah ada sejak lama
waktu

Kami memiliki masalah yang sama ketika resolusi waktu dari Firebird
meningkat dari milidetik menjadi mikrodetik. Banyak kode itu
mengharapkan tidak ada waktu sub kedua mulai melanggar karena ekstra
detail. Perbaikannya adalah 'CURRENT_TIME [(presisi)]' tetapi kompromi pada
default menghasilkan CURRENT_TIMESTAMP. = CURRENT_DATE + CURRENT_TIME
kecuali jika Anda benar-benar menyetel ketepatan keduanya agar cocok

Di PHP itu sebenarnya bukan masalah karena data yang dikembalikan memiliki
untuk diubah menjadi string dan ibase. timestampformat menyaring
bagian pecahan pula, dan bahkan detik dapat dipangkas jika
sesuai, jadi format string 'default' akan menyelesaikan masalah
membandingkan data waktu dari berbagai sumber?

--Lester Caine - G8HFL

Kontak - http. // lsces. bersama. uk/wiki/?page=contact
L. S. Layanan Elektronik Caine - http. // lsces. bersama. inggris
EnquirySolve - http. //penyelesaian pertanyaan. com/
Lokakarya Model Insinyur Digital - http. //medw. bersama. inggris
Media Digital Pelangi - http. //rainbowdigitalmedia. bersama. inggris

Bagaimana cara mendapatkan tanggal dengan milidetik di PHP?

Anda dapat dengan mudah melakukan ini dengan format input U. kamu. Dari halaman manual PHP untuk format tanggal. U = Detik sejak Unix Epoch. u = Mikrodetik

Bagaimana cara mendapatkan mikrodetik di PHP?

Fungsi microtime() adalah fungsi bawaan di PHP yang digunakan untuk mengembalikan stempel waktu Unix saat ini dengan mikrodetik. $get_as_float dikirim sebagai parameter ke fungsi microtime() dan mengembalikan string microsec sec secara default.

Apakah stempel waktu PHP dalam hitungan detik atau milidetik?

Deskripsi ¶ . 00. 00 GMT). Catatan. Stempel waktu Unix tidak berisi informasi apa pun yang berkaitan dengan zona waktu lokal mana pun. seconds since the Unix Epoch (January 1 1970 00:00:00 GMT). Note: Unix timestamps do not contain any information with regards to any local timezone.

Apa yang dikembalikan Microtime di PHP?

Fungsi microtime() mengembalikan stempel waktu Unix saat ini dengan mikrodetik .