PHP &

5 Cevap php

Ben tarihi + saati depolamak için ZAMAN kullanarak düşünüyordum, ama ben bunun üzerinde yıl 2038 bir sınırlama olduğunu okudum. Bunun yerine toplu olarak benim soru sorma, ben acemi kullanıcılar hem de anlamak için kolay olduğunu çok küçük parçalar halinde onu kırmak için tercih. Yani benim soru (lar):

  1. Tam olarak 2038 yılı sorunu nedir?
  2. Neden oluşur ve oluştuğunda ne olur ki?
  3. Bunu nasıl çözebilirim?
  4. Benzer bir sorun teşkil etmez bunu kullanarak olası alternatifler var mı?
  5. Gerçekten meydana geldiğinde biz, sözde sorunu önlemek için, ZAMAN kullanmak mevcut uygulamalara ne yapabilirim?

Şimdiden teşekkürler.

5 Cevap

I have marked this as a community wiki so feel free to edit at your leisure.

What exactly is the Year 2038 problem?

"(Aynı zamanda Y2K problemi kıyasen Unix Milenyum Bug, Y2K38 olarak da bilinir) 2038 yılının sorun bazı bilgisayar programı önce veya yıl 2038 yılında başarısız olmasına neden olabilir. Sorun, tüm yazılım ve imzalı 32 olarak sistem saatini saklamak sistemleri etkiler -bit tamsayı ve 1 Ocak 1970 00:00:00 UTC beri saniye sayısı olarak bu sayı yorumlamak. "


Why does it occur and what happens when it occurs?

03:14:07 UTC on Tuesday, 19 January 2038 'etrafında sarmak' ve bu sistemler 2038 13 Aralık 1901 bir zaman olarak yorumlamak yerine bir negatif bir sayı olarak dahili saklanabilir. Bu gerçeği nedeniyle ötesinde katıdır sayı saniye beri UNIX dönem (1 Ocak 1970 00:00:00 GMT) 32-bit işaretli tamsayı için bir bilgisayarın maksimum değerini aşmış olacak.


How do we solve it?


Are there any possible alternatives to using it, which do not pose a similar problem?

Mümkün veritabanlarında tarihleri ​​depolamak için büyük türlerini kullanmaya çalışın: 64-bit yeterlidir - GNU C ve POSIX uzun uzun tip / SuS, veya sprintf('%u'...) PHP veya BCMath uzantısı.


What are some potentially breaking use cases even though we're not yet in 2038?

Yani MySQL DATETIME 1000-9999 arasında bir dizi var, ama TIMESTAMP sadece 1970-2038 yelpazesine sahiptir. Sistem doğum günlerinin, gelecek ileri tarihlerini (örneğin 30 yıl ipotek), veya benzer depolar, zaten bu hata çalıştırmak için gidiyoruz. Bu bir sorun olacak olursa yine, ZAMAN kullanmayın.


What can we do to the existing applications that use TIMESTAMP, to avoid the so-called problem, when it really occurs?

Henüz pek bir miras platformu web olarak öngörmek zor olsa birkaç PHP uygulamaları hala, 2038 yılında civarında olacak.

Burada TIMESTAMP DATETIME dönüştürmek için bir veritabanı tablosu sütun değiştirmek için bir işlemdir. Bu geçici bir sütunu oluşturma ile başlar:

# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;

# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;

# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);

# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`

Resources

Tarihleri ​​depolamak UNIX zaman kullanırken, aslında 1970/01/01 beri saniye sayısını tutar 32 bit tamsayılar kullanıyorsanız; bkz Unix Time

Bu 32 bit sayı 2038 yılında taşma olacaktır. İşte 2038 sorun.


To solve that problem, you must not use a 32 bits UNIX timestamp to store your dates -- which means, when using MySQL, you should not use TIMESTAMP, but DATETIME (see 10.3.1. The DATETIME, DATE, and TIMESTAMP Types) :

The DATETIME type is used when you need values that contain both date and time information. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.

The TIMESTAMP data type has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.


The (probably) best thing you can do to your application to avoid/fix that problem is to not use TIMESTAMP, but DATETIME for the columns that have to contain dates that are not between 1970 and 2038.

Bir küçük not, ancak: orada çok yüksek bir olasılıkla (statistically speaking) uygulama 2038 kez önce oldukça çift yeniden yazılmış olacak ^ ^ Yani belki, tarihleri ​​ile uğraşmak zorunda yoksa Gelecekte, size uygulamanın güncel sürümü ile bu soruna dikkat çekmek zorunda kalmazsınız ...

Google'da hızlı arama hile yapacak: Year 2038 problem

  1. (Ayrıca Y2K problemi kıyasen Unix Milenyum Bug, Y2K38 olarak da bilinir) 2038 yılının sorun bazı bilgisayar programı yıl 2038 öncesi ya da başarısız olmasına neden olabilir
  2. Sorun imzalı 32-bit tamsayı olarak sistem saatini saklamak tüm yazılım ve sistemleri etkiler ve 1 Ocak 1970 00:00:00 UTC beri saniye sayısı olarak bu numarayı yorumlamak. Bu şekilde temsil edilebilir son zaman Salı 03:14:07 UTC olduğunu, 19 Ocak 2038. Times, bu anın ötesinde "saran" olacak ve bu sistemlerin yerine 2038 daha 1901 yılında bir tarih olarak yorumlayacaktır negatif bir sayı, dahili olarak saklanabilir
  3. Varolan CPU / OS kombinasyonları, mevcut dosya sistemleri veya mevcut ikili veri formatları için bu sorun için kolay bir düzeltme yoktur

Eğer damgaları görüntülemek için PHP kullanmak gerekiyorsa Bros, bu UNIX_TIMESTAMP biçimi değiştirmeden İYİ PHP çözümdür.

A custom_date () işlevini kullanın. İçerisinde, DateTime kullanın. Here's the DateTime solution.

As long as you have UNSIGNED BIGINT(8) as your timestamps in database. As long as you have PHP 5.2.0 ++

http://en.wikipedia.org/wiki/Year_2038_problem detayları çoğu vardır

Özetle:

1) + 2) sorun olduğunu 1970/01/01 beri saniye sayısına eşit bir 32 bitlik imzalı int gibi birçok sistem mağaza tarih bilgisi. Bu gibi saklanabilir son tarih Salı günü 03:14:07 UTC, 19 Ocak 2038 olduğunu., Bu int "saran" ve 1901 yılında bir tarih olarak yorumlanır negatif bir sayı olarak saklanır durumda. tam o zaman ne olacak, sistemden sisteme değişir ama muhtemelen bunlardan herhangi biri için iyi olmayacaktır söylemek yeterli!

Sadece geçmişte tarihleri ​​sakladığımız sistemlere, o zaman ben bir süre için endişelenmenize gerek yok sanırım! Asıl sorun gelecekte tarihleri ​​ile çalışma sistemleri ile. Sistem gelecekte tarihleri ​​28 yıl ile çalışmak gerekiyorsa o zaman şimdi endişe başlamalıdır!

3) Mevcut alternatif tarih biçimlerinden birini kullanın veya bir 64-bit sisteme geçmek ve 64-bit İnts kullanın. Veya veritabanları (DATETIME kullanmak için MySQL gibi) alternatif bir zaman damgası biçimini kullanmak için

4) 3. bakın!

5) 4 görün! ;)