2009-05-08 6 views
5

Windowsの公式のPython 2.5は、32ビットのtime_tを使用するVisual Studio.Net 2003でビルドされました。したがって、年が2038年を超える場合は例外になります。2038年の公式Windows Python 2.5の使用方法

これはPython 2.6(time_tをVS2008で64ビットに変更)で修正されていますが、多くのモジュールが既にコンパイルされているため、2.5を使用したいと思います。

ここに私の質問があります。私のプログラムが2038年を簡単に処理できるようにするための解決策はありますか?公式のPython 2.5をまだ使用していますか?例えば、"time64"や "longtime"などのあらかじめ作成されたライブラリの場合...

2.6+にアップグレードするか、バグを忘れないでください - 私はそれを動作させる必要がある理由があります私はここに質問を掲示する。

+0

2038は遠く離れています...心配しないでください。

+4

人々は80/90で2000年を長く考えていました。そのため、Y2Kバグがあります。 – Francis

+1

日付を "20080122"のような文字列として保存します。冗長ゼロを削除して最適化してください。だからそれは "8-12-2"になります。あなたは2000年なので、2は必要ありません。簡単にアクセスするためのXMLファイルでその店にそれをした後:あなたはあなたのアプリケーション全体でこれを使用する場合は あなたは何の問題や必要がないだろう組み込み日付型の場合 – drozzy

答えて

3

私が見つけた最良の解決策は、Python 2.5のソースコピーを入手して、time_tを64ビットにデフォルト設定するコンパイラで時間モジュールを再コンパイルすることです(例えば、VS2005またはVS2008サイドバイサイドの問題を防ぐ)。

5

標準ライブラリのdatetimeモジュールが正常に動作するはずです。 datetimeが提供していないモジュールtimeから何が必要ですか?

+0

これまでにdatetimeを試しましたか? datetimeはtime_tに基づいておらず、time_t64もサポートしていません。(try datetime.datetime.fromtimestamp(LARGE_NUMBER_HERE)) – Francis

+0

@Francis:私もdatetimeを使用します。 time_tに基づいていないので、大きな影響はありません。 datetimeを使用すると何が問題になりますか?特定のバグや問題はありますか? –

+2

はい。 datetimeは役に立ちません - time.time()のようなtime_tを取得する必要がある場合、Y2039をdatetimeに渡すと、 "ValueError:タイムスタンプの範囲がタイムアウト時間を超えています"というメッセージが表示されます。 システムクロックをYear 2039に変更すると、datetime.date.today()の呼び出しも "ValueError:タイムスタンプがプラットフォームのlocaltime()関数のタイムスタンプ"として失敗します。 datetimeは何も変更しません。デフォルトのタイムモジュールへのラッパーです。 – Francis

5

私は陳腐な音を意味するものではありませんが、なぜ:

  • を2038
前に、将来のある時点でのPython 2.6へのPython 2.5
  • アップグレードとY2038バグを忘れます

    編集: 明確にする:(と私は楽しみを突くために意味するものではありませんでした—深刻だ)

    おそらく、今から2038年の間に不定期にPythonを2.6(またはそれ以降)にアップグレードすることができます。おそらく2012年です。おそらく2015年です。おそらく2037年です。

    Pythonのタイムスタンプ変数あなたのアプリケーションは、(私はPythonのユーザーの多くはないんだけど)、これらは考慮することが重要な側面になるように思える:

    • 永続的に保存されている内容のデータどのようになっているのPython 2.5タイムスタンプ変数永続化され、Python 2.6を使用して復元されます(おそらく "正しいことをします")
    • 古いデータが、あいまいさが発生するのに十分長い間、永続的な形で保存されるかどうか(例えば、 1950年から2049年の間と考えたときに年の「96」は曖昧でないですが、そのデータが年間2230まで周りに保たれているならば、「96」は1996年、2096年、または2196)

    答えが良好である場合は可能性があり、正規のタイムスタンプを2038バグと一緒に使用してください。別のタイムスタンプ(例えば、データベースのタイムスタンプ文字列など)でアプリケーションを動作させるためには、再設計/リファクタリングの量と比較する必要があります。

  • +0

    ooh thats good(15 char limit dot!) – drozzy

    +0

    python 2.6はvc8のサイドランタイムを使用しているので、今は変更したくない(多くのモジュールが失敗する)。 – Francis

    +0

    +1:アップグレードを行うには、2037年7月のOutlookカレンダーにメモを記入してください。 –

    関連する問題