1


0

1800年より前の過去の日付を表示する

履歴イベントのシステムがあります。 これを使用して日付を表示しています

    date("j F, Y", strtotime($row['dated']));

しかし、「1877年10月21日」を試すと、「1969年12月31日」と表示されます。

どうすればこの問題を解決できますか?

5 Answer


3


書式設定された日付をタイムスタンプに変換してから書式設定された日付に戻す必要がないように、MySQLに日付の書式設定を希望する方法で行うことができます。


2


問題は、 `strtotime`が日付をunix_timestampに変換することです。これは1970-01-01 00:00:00 UTCからの秒数です。 unix_timestamp '0’では、米国では1969年12月31日のままです。

@Dan Grossmanが言ったように、MySQLから直接正しい形式を取得してください。 例えば:

SELECT DATE_FORMAT(dated, '%d %M, %Y')
FROM history


1


このMySQLにタグを付けたので、UNIXタイムスタンプには範囲の制限が厳しいため、日付/日付と時刻の表現に DATE`または DATETIME`型を使用することをお勧めします「DATE」の1001-9999とは対照的です)。

_ _ 注意:

タイムスタンプの有効範囲は、通常、Fri(1901年12月13日20時45分54秒UTCから2038年1月19日3時14分07秒UTC)です。 また、すべてのプラットフォームが負のタイムスタンプをサポートしているわけではないため、日付範囲はUnixエポックより前の日付に制限される場合があります。 これはつまり 1970年1月1日より前の日付は、Windows、一部のLinuxディストリビューション、およびその他のいくつかのオペレーティングシステムでは機能しません。 しかし、PHP 5.1.0以降のバージョンではこの制限を克服しています。 _ _

言い換えると、UNIXタイムスタンプは符号付き32ビット整数であり、cca 137年のスパン(1901〜2038)のみを表現できます。 PHPでこれを行いたい場合は、http://uk.php.net/manual/en/book.calendar.php [Calendar]関数のようなものを見るべきです。

おそらく、より良い解決策は、MySQLの DATETIME`型を(使用していると思われる文字列型ではなく)使用し、 DATE_FORMAT() `を使用して日付をフォーマットすることです。

また、さまざまな国がさまざまな時間に今日の最も一般的なグレゴリオ暦に切り替えていることに注意してください。 ロシアはまだ19世紀のユリウス暦を使用していました(2日間で数日間の差があります)。


1


それを使う

`$ date = new DateTime($ row ['dated']); echo $ date→ format( 'Y-m-d H:i:s'); `

ここからhttp://www.php.net/manual/en/datetime.format.php


0


Piskvorとeumiroは、これが起こる理由を説明したので、繰り返しません。 これを避けるためにあなたがすべきことは、日付をフォーマットするための独自のリッテ関数を書くことです-単にhttp://de2.php.net/manual/de/function.explode.php[explode]を使用して日付のすべての部分を取得します次のように、その部分からニードルフォーマットを再構築します。

list($year,$month,$day,$hour,$minute,$second) = explode('-',str_replace(array(' ',':'),'-',$row['dated']);
$output = "$day $month, $year";

これは完璧なジェットではなく、日付を数値として出力します-しかし、アイデアを得ることができます(月名の保存に配列を使用し、「$ month」の代わりに「$ monthname [$ month]」を出力できます)

しかし:、データベースに日付をフォーマットさせることもできるので、結果を出力する必要があります-このウィッチが最良のアイデアだと思います(私は頭の中で構文がわからないので、グーグルに聞いてください)そのために)