Apakah ada konstanta untuk “akhir zaman”?

12

Untuk beberapa sistem, nilai waktu 9999-12-31 digunakan sebagai "akhir waktu" sebagai akhir waktu yang dapat dihitung komputer. Tetapi bagaimana jika itu berubah? Bukankah lebih baik mendefinisikan waktu ini sebagai variabel bawaan?

Dalam bahasa pemrograman C dan lainnya, biasanya ada variabel seperti MAX_INTatau mirip untuk mendapatkan nilai terbesar yang bisa dimiliki integer. Mengapa tidak ada fungsi yang sama MAX_TIMEyaitu mengatur variabel ke "akhir waktu" yang untuk banyak sistem biasanya adalah 9999-12-31. Untuk menghindari masalah hardcoding ke tahun yang salah (9999) dapatkah sistem ini memperkenalkan variabel untuk "akhir waktu"?

** Contoh nyata **

End of validity date: 31/12/9999.(dokumen resmi terdaftar seperti ini) Blogger ingin menulis halaman yang selalu di atas, halaman selamat datang. Jadi diberikan tanggal sejauh mungkin di masa depan:

3000? Ya, halaman sambutan yang Anda hadapi diposting pada 1 Januari 3000. Jadi halaman ini akan disimpan di bagian atas blog selamanya =) Ini sebenarnya diposting pada 31 Agustus 2007.

Niklas
sumber
6
Mengapa? Ini sepertinya masalah yang bisa diselesaikan dengan menerapkan algoritma atau struktur data yang benar.
Euforia
16
Saya kira sebagian besar orang belum terlalu khawatir tentang masalah Y10K :-) Terutama karena sebelumnya kita pasti akan memiliki masalah Y2038 , dan mungkin beberapa lagi ...
Péter Török
2
@ Thorbjörn, ya, mungkin sebagian besar sistem live akan dimigrasi saat itu. Namun demikian, saat ini masih ada sejumlah sistem embedded lama, database legacy, file dalam format file usang yang saat ini tidak dapat diperkirakan, dll.
Péter Török
14
Saya pikir kalender Maya memiliki konstanta "akhir waktu" = 2012-12-21 ;-)
nikie
3
Tidak ada yang tahu kapan "akhir zaman" akan terjadi.
Tulains Córdova

Jawaban:

47

Tanyakan pada diri Anda mengapa Anda perlu variabel seperti itu di tempat pertama.

Kemungkinan besar, Anda berbohong tentang data Anda: setiap kali Anda membutuhkan variabel "akhir waktu", Anda tidak mengacu pada akhir waktu yang sebenarnya; melainkan Anda mengungkapkan hal-hal seperti "tidak ada batas atas untuk tanggal ini", "acara ini berlanjut tanpa batas waktu", atau serupa.

Maka solusi yang benar adalah dengan mengekspresikan maksud ini secara langsung alih-alih mengandalkan nilai ajaib: gunakan jenis tanggal yang dapat dibatalkan (di mana nullmenunjukkan "tidak ada tanggal akhir yang ditetapkan"), tambahkan bidang boolean "tidak terbatas", gunakan pembungkus polimorfik (yang dapat dapat berupa tanggal nyata atau nilai "tidak terbatas" khusus), atau apa pun yang ditawarkan oleh bahasa pemrograman Anda.

Tentu saja, solusi yang tepat tidak selalu layak, jadi Anda mungkin akhirnya menggunakan nilai ajaib, tetapi ketika Anda melakukannya, Anda harus memutuskan nilai yang sesuai berdasarkan per-kasus, karena tanggal mana yang dilakukan dan tidak masuk akal tergantung pada domain yang Anda modelkan - jika Anda menyimpan cap waktu log, 01/01/2999 adalah "akhir waktu" yang masuk akal; kemungkinan aplikasi Anda masih digunakan hampir 1000 tahun dari sekarang, menurut saya, praktis nol. Pertimbangan serupa berlaku untuk aplikasi kalender. Tetapi bagaimana jika perangkat lunak Anda menangani data ilmiah, katakanlah, prediksi jangka panjang tentang iklim Bumi? Mereka mungkin benar-benar ingin melihat seribu tahun ke depan. Atau selangkah lebih maju; astronomi, bidang yang sangat masuk akal dalam rentang waktu yang sangat besar dalam urutan miliaran tahun, baik ke jalan dan masa depan. Bagi mereka, 01/01/2999 adalah maksimum sewenang-wenang yang sangat konyol. OTOH, sistem kalender yang mampu menangani rentang waktu sepuluh triliun tahun ke depan hampir tidak praktis untuk sistem pelacakan penunjukan dokter gigi, jika hanya karena kapasitas penyimpanan.

Dengan kata lain, tidak ada pilihan tunggal terbaik untuk nilai yang salah dan sewenang-wenang menurut definisi. Inilah sebabnya mengapa sangat tidak biasa untuk melihat yang didefinisikan dalam bahasa pemrograman apa pun; yang biasanya tidak menamakannya "akhir waktu", melainkan sesuatu seperti DATE_MAX(atau Date.MAX), dan menganggapnya sebagai "nilai terbesar yang dapat disimpan dalam tipe data tanggal", bukan "akhir zaman" atau "tanpa batas".

tammmer
sumber
20
menggunakan null berarti nilai khusus tidak benar-benar lebih baik daripada menggunakan nilai khusus
Ryathal
2
@Ryathal Yah, saya pikir tidak ada bug 'nullenium', jadi setidaknya sedikit lebih baik ...
K.Steff
8
@ Ryathal: sebenarnya bukan. Ada banyak tindakan yang dapat Anda lakukan pada angka ajaib yang tidak dapat Anda lakukan pada nol.
Pieter B
21
@Ryathal - nulldalam hal ini tidak digunakan sebagai nilai khusus, itu digunakan sebagai makna yang benar null, yaitu "hilang". Jadi jika bidang Anda ExpiryDate, mana yang lebih benar: null(artinya tidak ada tanggal kedaluwarsa) atau END_OF_TIME(yang tidak ada, sejauh yang kami tahu). Jelas nullatau NoValuesesuatu yang serupa adalah solusi yang lebih baik.
Scott Whitlock
3
@jwenting - Mereka tidak membuat perbedaan karena tidak ada satu. NULL berarti tidak ada atau dalam istilah yang lebih manusiawi nilainya tidak didefinisikan.
Ramhound
17

Sebagai sebuah industri, kita telah dikenal picik dan sewenang-wenang dalam upaya menyelamatkan beberapa byte misalnya

  • 31 Des 99
  • 19 Januari 2038
  • T + 50 tahun, ketika semoga semua sistem yang saya gunakan telah mati atau diganti (atau saya mati, mana yang lebih dulu).

IMHO, taruhan terbaik adalah tetap menggunakan tingkat abstraksi utama yang sesuai pada 'tanggal maksimum', dan berharap solusi umum telah mengatasi masalah ini sebelum waktunya tiba.

misalnya dalam .NET, DateTime.MaxValue sewenang-wenang 23:59:59.9999999, December 31, 9999, exactly one 100-nanosecond tick before 00:00:00, January 1, 10000. Jadi, jika asumsi saya tentang umur panjang saya salah, dan tahun 10.000 tiba, saya agak berharap bahwa kompilasi ulang aplikasi saya dengan versi kerangka kerja yang lebih baru akan meluas DateTime.MaxValue(misalnya dengan mengubah jenis yang mendasarinya) ke nilai sewenang-wenang baru dan menendang masalah lebih jauh di jalan selama beberapa milenium.

Edit

(Memperkuat poin tdammers 'bahwa daripada menipu tanggal buatan, bahwa lebih tepat untuk secara eksplisit menyoroti fakta kepada konsumen bahwa kita tidak memiliki tanggal akhir.)

Sebagai alternatif untuk menggunakan null, yang memiliki konsekuensi negatif menjadi tipe yang kompatibel dengan semua jenis referensi (termasuk. Net Nullable`), yang kemungkinan akan menyebabkan masalah NRE pada konsumen yang lupa untuk memeriksa, dalam bahasa FP, adalah hal biasa untuk menggunakan Opsi atau Mungkin Ketik pembungkus di sekitar nilai yang mungkin, atau mungkin tidak dikembalikan.

Kode palsu:

Option<DateTime> LeaseExpiryDate(Home rental) 
{
    if (... expiry date can be determined ...)
       return Some(rental.ExpiryDate);
    else
       return None;
}

Manfaat melakukan ini adalah memaksa konsumen untuk bernalar atas kedua kasus. Pencocokan pola juga biasa di sini:

LeaseExpiryDate(myHome) match {
     case Some(expiryDate) => "Expired"
     case None => "No Expiry"
}
StuartLC
sumber
Duh. Saya buta. Lupakan.
ott--
Suatu hari, mungkin. kita akan memiliki William Kahan untuk tanggal dan waktu. Kami akan memiliki hal-hal seperti cap waktu tak terbatas positif dan negatif, " NaT" nilai, dll.
Ross Patterson
4
Tidak bisa tidak diingatkan akan hal ini: exit109.com/~ghealton/y2k/y2k_humor/Cobol.html
Julia Hayward
7

Anda mungkin menginginkan algebraic data typevarian dengan infinite besar date. Kemudian tentukan perbandingan, di mana infinitevarian akan selalu lebih besar daripada yang lain date.

Contoh dalam Scala:

sealed abstract class SmartTime extends Ordered[SmartTime] { x =>
        def compare(y: SmartTime) = {
                x match {
                        case InfiniteFuture => 1
                        case InfinitePast => -1
                        case ConcreteTime(x) =>
                                y match {
                                        case InfiniteFuture => -1
                                        case InfinitePast => 1
                                        case ConcreteTime(y) => x compare y
                                }
                }
        }
}
case class ConcreteTime(t: Long) extends SmartTime
case object InfiniteFuture extends SmartTime
case object InfinitePast extends SmartTime

http://ideone.com/K5Kuk

Nama tampilan
sumber
Kutip kode dalam jawaban Anda untuk keturunan.
Mematikan
2

Menyimpan waktu Anda sebagai 64 bit IEE754 angka floating point presisi ganda, dan Anda dapat menggunakan +INF. Jangan gunakan presisi tunggal, itu hanya akurat hingga 7 digit yang agak rendah untuk kencan.

MSalters
sumber
1

Cocoa / Objective-C memiliki metode pabrik [NSDate distantPast] dan [NSDate distantFuture] yang mewakili jenis barang yang Anda maksud.

Nilai yang dikembalikan oleh implementasi saat ini adalah konstanta yang mewakili sekitar 0 AD dan 4000 AD, meskipun ini tidak dijamin atau didokumentasikan.

grahampark
sumber
0

Biasanya tidak ada nilai seperti itu, karena itu tidak akan berguna sebagai bahasa konstruksi.

MAX_INTdan kerabatnya semua melayani tujuan. Mereka dapat digunakan dalam kode Anda untuk memeriksa terhadap luapan. Ini berguna jika Anda akan membuat dan mengelola objek data besar dalam array, vektor, apa pun. Ini juga merupakan nilai spesifik platform yang cukup.

Kasus penggunaan untuk MAX_DATEnilai lebih sulit dilihat. Biasanya ini hanya nilai-nilai, mereka tidak digunakan sebagai bagian dari struktur program, sehingga nilai yang berputar-putar tidak akan memiliki konsekuensi yang merusak bagi program (meskipun mungkin untuk data). Juga, tipe tanggal dan waktu dalam C, C ++ dll. Biasanya lebih tegas didefinisikan; dan orang-orang yang menulis program tidak perlu khawatir bahwa itu akan berubah di antara platform.

TZHX
sumber
0

Pada satu proyek yang kami lakukan, kami memiliki situasi di mana ukuran beberapa database dilakukan dengan cara yang tidak akan berkelanjutan setelah 30 tahun menggunakan perangkat lunak. Ketika klien bertanya kepada insinyur utama kami pada saat itu: "Ya, apa yang akan kita lakukan setelah 30 tahun menggunakan perangkat lunak Anda?" Insinyur utama kami, dingin seperti mentimun, menjawab sambil mengangkat bahu: "Kami akan pergi dan minum bir!"

Intinya, gunakan saja tanggal yang cukup jauh di masa depan. Kemungkinan perangkat lunak Anda akan ditingkatkan atau diganti saat itu. :)

Vladimir Stokic
sumber