あなたがぶつかる場合は大晦日の日には、バグをフォーマット?

2020年の登場前に、日付フォーマット操作は、私はあなたのシステムが経験しているかどうかわからない、大晦日レベルのプログラマのバグを準備しましたか?

この日付に似て12分の2020 / 29,2020 / 12 / 30,2020 / 12月31日、ディスプレイの2020年元旦に登場し、多くのサイトに近づいて数日。驚くべきではありませんか?アシスタントツールで提供してもマイクロチャネルサブスクリプション数は、このような間違いを浮上しています。

次の二つのマップは、12月31日アシスタントアシスタントのスクリーンショットでは、公開番号「新しい地平線プログラム」のサブスクリプションの数です。

パーツの新しいファンの時刻表示。

画像

表示されるコンテンツのコメントタイムゾーンの部分。
画像

上の図は、時間と新たなファンのコメントは時間がある示し、「2020年12月31日。」だから、ここでは、このバグ発生の原因を分析するために来ます。千個の言葉に値する例としては、最初の例で、このバグを復元します。

一例として、例を復元します:

public class DateFormatBug {

    public static void main(String[] args) throws ParseException {
        // 示例一
        printBugDate();
    }

    private static void printBugDate() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        Date date = sdf.parse("2020-1-1 13:12:12");
        System.out.println(date);
        String dateStr = sdf.format(date);
        System.out.println(dateStr);
    }
}

最初の行、2行目の印刷結果は何を思いますか?推測では、説明のためにスマートである場合は、上記のように言われてきた、この例では、バグを復元することです。

印刷ログは、次のとおりです。

Sun Dec 29 13:12:12 CST 2019
2020-12-29 13:12:12

驚くべきではありませんか?文字列「2020年1月1日夜01時12分12秒は、」実際には2019年12月29日までをプリントアウトした日付に解決します!そして、これまでに処理された日2020年12月29日になっています!完全に台無しに、私たちが欲しいのは2020年1月1日の日付ああです。

例二、拡張例:

private static void printBugDateExtend() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
    Date date = sdf.parse("2019-12-31 13:12:12");
    System.out.println(date);
    String dateStr = sdf.format(date);
    System.out.println(dateStr);
}

これは、ちょうど日が2020年1月1日2019年12月31日から変更されましたが、結果が何であるかを推測印刷?あなたが推測することを確認してください。ここでは、印刷結果は次のとおりです。

Sun Dec 30 13:12:12 CST 2018
2019-12-30 13:12:12

2018年12月30日?でも、年が間違っています。

手動アリババの実践は、あなたのIDEプラグインにインストールされている場合まあ、推測ではありません。上記の情報を求めているあなたは、 ":MM:SS YYYY-MM-DD HH" を見つけるでしょう。新しいバージョン(バージョン華山)アリババのJava開発マニュアルを開くと同様に、この問題が明確に説明されています。

画像

だから、どこで、「マニュアルアリババのJava Development」の新バージョンを入手できますか?国民の関心番号「新しい地平線番組、」友人は、単にPDFのバージョンを取得するには、「005」に返信。新しい年、何も、開発マニュアルのメーカーを見る経験を学び、ステッピングピットを避けるためにすることは良いではありません。もちろん、継続的な学習の社会的関心の数は、別の良い選択です。

同時に、また、javadocは週ベース年の説明を参照し、以下のリンクを持つ:https://docs.oracle.com/javase/8/docs/api/java/time/temporal/WeekFields.html

A week is defined by:

(1) The first day-of-week. For example, the ISO-8601 standard considers Monday to be the first day-of-week.

(2) The minimal number of days in the first week. For example, the ISO-8601 standard counts the first week as needing at least 4 days.

Together these two values allow a year or month to be divided into weeks.

それはこれに沸く:年に週に基づいて、週に1年だけに属します。請求週の最初の日から開始し、4日以上の日数(日数の最小数)年の最初の週、特定の年の正月は、特定の状況に依存周そうということ。

しかし、どんな最良の方法は、年を表すために「Y」の大文字使用を避けることではありません。

無書籍として、すべての本を信じて、私たちは効果を見るためにそれを再度実行し、「Y」に変更し、「Y」をコーディングします。

private static void printDate() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse("2020-1-1 13:12:12");
    System.out.println(date);
    String dateStr = sdf.format(date);
    System.out.println(dateStr);
}

private static void printDateExtend() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse("2019-12-31 13:12:12");
    System.out.println(date);
    String dateStr = sdf.format(date);
    System.out.println(dateStr);
}

印刷結果は以下の通りであります:

Wed Jan 01 13:12:12 CST 2020
2020-01-01 13:12:12
Tue Dec 31 13:12:12 CST 2019
2019-12-31 13:12:12

明らかに、これは大晦日のバグ修正です。

専門家や初心者の違いではないされています。この後、我々は質問かどうかを熟考のだろうか?おそらく、あなたは、通常の状況下で上記の質問、同じ日付形式、双方向機能を答えることができ、専門家と初心者を区別することはできません。唯一いつかいくつかの極端な場合に与えられた瞬間の高いマスターで見ながら。

だから、専門家から来ますか?ピットから出てジャンプします。あなたが外出するよりおそらく彼は以前に陥っていた、多分彼はあなたがこの記事を読んで、今はおそらく同じである「偶然の出会い」を、持っている本を読んで。

オリジナルリンク:「大晦日のバグ、あなたがにぶつかる場合は?"


新しい地平線プログラム :エキサイティングで成長を見逃してはなりません

新しい地平線プログラム - マイクロチャンネル公衆数

おすすめ

転載: www.cnblogs.com/secbro/p/12131361.html