Timestamp, masalah tahun 2038 untuk sistem Ubuntu 64 bit

24

Saya menggunakan sistem Ubuntu 64 bit.

Saat ini saya sedang mengerjakan proyek yang menggabungkan MariaDB. Saya berencana untuk memperkenalkan teknik cap waktu ke dalam proyek sehingga orang akan menerima waktu yang tepat untuk zona waktu yang berbeda.

Saya pernah mendengar dan membaca beberapa artikel tentang masalah tahun 2038 untuk timestamp. Banyak artikel menyarankan agar kita menggunakan sistem 64 bit untuk membeli "bit" lebih banyak waktu.

Berapa banyak waktu yang dimaksud dengan "bit" ini? Apakah cukup lama bagi kami untuk dapat mengelola aplikasi web sampai akhir? Jika bukan itu masalahnya, apakah ini hanya perpanjangan dua tahun sehingga ketika tahun 2040 tiba, apakah kita akan memiliki aplikasi yang tidak berfungsi dengan baik?

tet
sumber
27
Sistem 64-bit menggunakan time_tbilangan bulat 64-bit akan memberi Anda lebih banyak waktu - hingga 15:30:08 pada hari Minggu, 4 Desember 292.277.026.596. Semoga cukup lama untuk aplikasi Anda;)
Ron
4
Itu tidak memberi Anda "sedikit" lagi. Ini memberi Anda persis 32 bit lebih.
user12205
5
Stempel waktu 64-bit adalah salah satu dari tindakan sementara itu. Bagaimana dengan orang-orang yang mengerjakan Proyek Utopia pada 100.000.000.000.000 CE? Mereka akan membutuhkan sistem komputer fungsional juga! Menggunakan cap waktu 128-bit akan memungkinkan kita secara unik mengidentifikasi waktu dari tidak hanya iterasi alam semesta ini, tetapi banyak, banyak lainnya.
Blacklight Shining
1
Karena Anda belum pernah menerima jawaban sebelumnya di situs ini: Jika salah satu jawaban di bawah ini membantu Anda, jangan lupa klik abu-abu di sebelah kiri teksnya, yang berarti Ya, jawaban ini valid ! ;-)
Fabby

Jawaban:

34

Nah jika ada opsi untuk benar-benar membeli "bit", yaitu transfer dari integer 32bit yang ditandatangani ke integer 32bit yang tidak ditandatangani, semuanya tetap berfungsi hingga 2106.

Mentransfer ke 64bit adalah "agak lebih baik". Anda mendapatkan resolusi ratusan miliar tahun.

Dan Ubuntu melakukan ini:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800

Namun, itulah level OS. Hanya karena Ubuntu menggunakan integer 64bit untuk zamannya tidak berarti bahwa MySQL / MariaDB akan menggunakannya untuk menyimpan stempel waktu. Jika tanggal melewati 2038 penting bagi Anda sekarang, segera mulai pengujian.

Sebenarnya, saya dapat menghemat waktu Anda. Itu masih rusak. Bug ini dilaporkan lebih dari satu dekade yang lalu tetapi tes utamanya masih gagal dengan int 64bit.

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

Ini bahkan bukan penyimpanan. Agak menyedihkan.

(Dan ya, itu dijalankan pada MariaDB, versi 10.1)

Oli
sumber
8
10 tahun yang lalu, mereka masih memiliki 22 tahun untuk memperbaikinya. <Melintasi jari> ...
Mindwin
4
NB: Menggunakan bilangan bulat 32 bit yang tidak ditandatangani adalah peretasan .
Kevin
6

Jangan menyimpannya sebagai integer sama sekali. Simpan sebagai string tanggal yang diformat ISO 8601 . Ini adalah format standar yang digunakan di Internet.

9999-12-31T23:59:59+00:00
dobey
sumber
17
Mari kita semua mengangkat gelas ke Bug Year10K! ;) Tetapi dalam keseriusan, sementara string benar-benar dapat diperpanjang, mereka relatif besar (contoh Anda adalah 200 bit!) Dan parsing dan memanipulasi angka primitif adalah bazillion kali lebih cepat. Itu penting.
Oli
6
Ini adalah format yang bagus untuk ditampilkan - dan hanya untuk itu. Untuk hal lain (yaitu, menangani data sampai saat terakhir ketika Anda memutuskan untuk memformatnya kepada pengguna), seperti membandingkan, melakukan aritmatika dll. Cap waktu Unix sebagai integer (atau float) jauh lebih baik.
egmont
1
@ Oli Itu penting, jika itu benar-benar penting. Solusi ini tidak gagal ketika ada waktu lebih tua dari zaman UNIX. Formatnya adalah standar yang digunakan untuk tanggal di seluruh Internet, dalam protokol dan API. Jika Anda menyimpan sesuatu di kolom MariaDB, maka sebenarnya, Anda harus menyimpannya di disk. Tentu, dalam memori, mungkin Anda ingin menyimpannya ke dalam struktur data yang lebih dapat diterima. Dan Anda tidak membutuhkan 40 bit terakhir jika Anda selalu menggunakan UTC.
dobey