Y ফিরিয়ে আনে 2012 এবং যখন সিম্পলডেট ফরমেটে 2011 প্রদান করে


85

আমি ভাবছি কেন 'ওয়াই' ২০১২ সালে 'ওয়াই' ফেরত দিচ্ছে কেন SimpleDateFormat:

System.out.println(new SimpleDateFormat("Y").format(new Date())); // prints 2012
System.out.println(new SimpleDateFormat("y").format(new Date())); // prints 2011

কেন কেউ ব্যাখ্যা করতে পারেন?


40
ভবিষ্যতের পাঠকদের জন্য ঠিক যেমন একটি নোট: এই আচরণটি কেবল বছরের শেষ সপ্তাহে বা বছরের প্রথম সপ্তাহের মধ্যেই ঘটবে।
রাইভ্যানটেজ

উত্তর:


94

সপ্তাহ বছর এবং বছর। জাভাদোক থেকে

একটি সপ্তাহব্যাপী একটি WEEK_OF_YEAR চক্রের সাথে সিঙ্ক হয়। প্রথম এবং শেষ সপ্তাহের মধ্যে সমস্ত সপ্তাহের (সমেত) একই সপ্তাহের বছরের মূল্য থাকে। সুতরাং, এক সপ্তাহ বছরের প্রথম এবং শেষ দিনগুলিতে বিভিন্ন ক্যালেন্ডার বছরের মান থাকতে পারে।

উদাহরণস্বরূপ, 1 জানুয়ারী, 1998 বৃহস্পতিবার is যদি getFrestDayOfWeek () সোমবার হয় এবং getMinimalDaysInFirstWeek () 4 হয় (আইএসও 8601 স্ট্যান্ডার্ড সামঞ্জস্যপূর্ণ সেটিং), তবে 1998 সালের 1 সপ্তাহ 29 ডিসেম্বর, 1997 থেকে শুরু হবে এবং 4 জানুয়ারী, 1998 এ শেষ হবে সপ্তাহের 1998 শেষ তিন দিনের জন্য 1998 ১৯ calendar৯ সালের ক্যালেন্ডার বছরের however 1998 এর প্রথম তিন দিন 1997 সালের 53 সপ্তাহের অংশ এবং তাদের সপ্তাহের বছর 1997।


$ date Wed Dec 30 00:42:51 UTC 2015 $ date +%G 2015 $ date +%Y 2015 কিছু সফ্টওয়্যার বিভ্রান্ত হয়েছে: strftimeআজ (12/29/2015) সপ্তাহ 53, এবং সপ্তাহ-বছর 2015 হিসাবে গণনা করা হচ্ছে
utes

11

এখানে কিছু কোড সহ একটি জাভা 8 আপডেট রয়েছে, কারণ গ্রেগরিয়ানক্যালেন্ডার সম্ভবত ভবিষ্যতের জেডিকে সংস্করণগুলি থেকে অবচিত বা সরিয়ে দেওয়া হবে।

নতুন কোডটি WeekFieldsক্লাসে পরিচালনা করা হয় , এবং বিশেষত ফিল্ড অ্যাকসেসরের সাথে লোয়ার কেস y/ আপার ক্ষেত্রে ।YweekBasedYear()

এই উইকফিল্ডসের উপর ভিত্তি করে এক সপ্তাহ ভিত্তিক-বর্ষের বছরে অ্যাক্সেসের জন্য একটি ক্ষেত্র ফেরত দেয়। এটি বছরের ধারণাটি উপস্থাপন করে যেখানে সপ্তাহগুলি নির্দিষ্ট সপ্তাহের সপ্তাহে শুরু হয়, যেমন সোমবার এবং প্রতিটি সপ্তাহ ঠিক এক বছরের অন্তর্গত। এই ক্ষেত্রটি সাধারণত ডেওঅফওইক () এবং সাপ্তাহিক অফ উইকেটবয়েসইয়ার () ব্যবহার করে।

এক সপ্তাহ (1) হল getFayDayOfWeek () থেকে শুরু হওয়া সপ্তাহ যেখানে বছরে কমপক্ষে getMinimalDaysInFirstWeek () দিন থাকে। সুতরাং, এক সপ্তাহ শুরু হওয়ার আগে বছর শুরু হতে পারে। যদি প্রথম সপ্তাহটি বছরের শুরু হওয়ার পরে শুরু হয় তবে পূর্ববর্তী সময়টি পূর্ববর্তী বছরের শেষ সপ্তাহে।

এই ক্ষেত্রটি যে কোনও ক্যালেন্ডার সিস্টেমের সাথে ব্যবহার করা যেতে পারে।

বিশ্লেষণের সমাধানের পর্যায়ে, সপ্তাহ-ভিত্তিক-বছর, সপ্তাহের-বছরের এবং সপ্তাহের-দিন থেকে একটি তারিখ তৈরি করা যায়।

কঠোর মোডে, তিনটি ক্ষেত্রই তাদের বৈধ মানগুলির পরিসীমাটির বিরুদ্ধে বৈধ হয়। সপ্তাহের বছরের ফিল্ডটি বৈধ করা হয় যে ফলাফলটি ভিত্তিক সপ্তাহ-ভিত্তিক অনুরোধ সাপ্তাহিক-ভিত্তিক বছর।

স্মার্ট মোডে, তিনটি ক্ষেত্রই তাদের বৈধ মানগুলির পরিসীমাটির বিপরীতে বৈধ হয়। সাপ্তাহের সপ্তাহভিত্তিক বছরের ক্ষেত্রটি 1 থেকে 53 পর্যন্ত যাচাই করা হয়, যার অর্থ ফলাফলের তারিখটি নিম্নলিখিত সপ্তাহের উপর ভিত্তি করে নির্দিষ্ট হতে পারে।

লেনিয়েন্ট মোডে, বছর এবং সপ্তাহের দিনটি বৈধ মানগুলির ব্যাপ্তির বিপরীতে বৈধ হয়। ফলাফলের তারিখটি নিম্নলিখিত তিনটি পর্যায়ের পদ্ধতির সমান গণনা করা হয়। প্রথমে অনুরোধ সপ্তাহ-ভিত্তিক-বছরে প্রথম সপ্তাহের প্রথম দিনে একটি তারিখ তৈরি করুন। তারপরে সপ্তাহের সাপ্তাহিক-ভিত্তিক-বর্ষটি নিন, একটিকে বিয়োগ করুন এবং সপ্তাহে পরিমাণটি তারিখে যুক্ত করুন। অবশেষে, স্থানীয়ীকৃত সপ্তাহের মধ্যে-সপ্তাহের সঠিক দিনের সাথে সামঞ্জস্য করুন।

এই WeekFieldsউদাহরণটির সেটআপ লোকালের উপর নির্ভর করে এবং এর উপর নির্ভর করে বিভিন্ন সেটিংস থাকতে পারে, ফ্রান্সের মতো মার্কিন যুক্তরাষ্ট্র এবং ইউরোপীয় দেশগুলি সপ্তাহের শুরুতে আলাদা দিন থাকতে পারে।

DateFormatterBuilderজাভা 8 এর উদাহরণস্বরূপ , লোকেলের সাহায্যে পার্সার ইনস্ট্যান্ট করুন এবং Yপ্রতীকটির জন্য এই লোকেলটি ব্যবহার করুন :

public final class DateTimeFormatterBuilder {
    ...

    private void parsePattern(String pattern) {
        ...
                } else if (cur == 'Y') {
                    // Fields defined by Locale
                    appendInternal(new WeekBasedFieldPrinterParser(cur, count));
                } else {
        ...


    static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
        ...

        /**
         * Gets the printerParser to use based on the field and the locale.
         *
         * @param locale  the locale to use, not null
         * @return the formatter, not null
         * @throws IllegalArgumentException if the formatter cannot be found
         */
        private DateTimePrinterParser printerParser(Locale locale) {
            WeekFields weekDef = WeekFields.of(locale);
            TemporalField field = null;
            switch (chr) {
                case 'Y':
                    field = weekDef.weekBasedYear();
                    if (count == 2) {
                        return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0);
                    } else {
                        return new NumberPrinterParser(field, count, 19,
                                                       (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);
                    }
                case 'e':
                case 'c':
                    field = weekDef.dayOfWeek();
                    break;
                case 'w':
                    field = weekDef.weekOfWeekBasedYear();
                    break;
                case 'W':
                    field = weekDef.weekOfMonth();
                    break;
                default:
                    throw new IllegalStateException("unreachable");
            }
            return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE);
        }

        ...
    }

    ...
}

এখানে কিছু উদাহরণ

System.out.format("Conundrum                         : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'")));
System.out.format("Solution                          : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmms'S'")));


System.out.format("JVM Locale first day of week      : %s%n",
                  WeekFields.of(Locale.getDefault()).getFirstDayOfWeek());
System.out.format("US first day of week              : %s%n",
                  WeekFields.of(Locale.US).getFirstDayOfWeek());
System.out.format("France first day of week          : %s%n",
                  WeekFields.of(Locale.FRANCE).getFirstDayOfWeek());
System.out.format("JVM Locale min days in 1st week   : %s%n",
                  WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek());
System.out.format("US min days in 1st week           : %s%n",
                  WeekFields.of(Locale.US).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale min days in 1st week   : %s%n",
                  WeekFields.of(Locale.FRANCE).getMinimalDaysInFirstWeek());

System.out.format("JVM Locale week based year (big Y): %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("France week based year (big Y)    : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("US week based year (big Y)        : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.US).weekBasedYear()));

আর লোকেল এবং উপরের মামলার ব্যাপারে Y, হয় আপনি কমান্ড লাইন বিকল্প সঙ্গে খেলা করতে পারেন -Duser.language=( fr, en, es, ইত্যাদি), অথবা আবাহন সময়ে লোকেল ফোর্স:

System.out.format("English localized                 : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.ENGLISH)));
System.out.format("French localized                  : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.FRENCH)));

5

Yক্যালেন্ডার সাপ্তাহিক সপ্তাহ হলে সপ্তাহের বছর পাওয়ার জন্য ফর্ম্যাট । ( getCalendar().isWeekDateSupported())


0

অনুরোধ করা ফর্ম্যাটটি কভারের আওতায় YYYY ব্যবহার করে জেএসটিএল ট্যাগ লাইব্রেরির format:dateসাথে হার্ড উপায়টি শিখেছি short। যা সত্যই মুদ্রিত তারিখ এক বছরের সামনে রোল করতে পারে।


0

আমি একটি তারিখকে সামনে এবং পরে রূপান্তর করি - আপনি যখন এটি করবেন তখন আপনি একই বছর আশা করবেন।

লক্ষ্য করুন কীভাবে এটি অগ্রসর হয়!

এটি খারাপ: YYYY! হ্যাঁ

আপনি এটি এখানে চালাতে পারেন ।

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static java.lang.System.out;
class Playground {
    public static Date convertYYYYMMDDStr(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date result = null;
        try {
            result = sdf.parse(s);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    public static String formatDateToStrWithSDF(Date d, SimpleDateFormat s) {
        return s.format(d);
    }
    public static void main(String[ ] args) {
        // DON'T DO. Use yyyy instead of YYYY
        SimpleDateFormat sdfdmy = new SimpleDateFormat("dd-MM-YYYY"); 
        String jan1st2020sb = "2020-01-01";
        Date jan1st2020d = convertYYYYMMDDStr(jan1st2020sb);
        String jan1st2020sa = formatDateToStrWithSDF(jan1st2020d, sdfdmy);
        out.println(jan1st2020sb);
        out.println(jan1st2020d);
        out.println(jan1st2020sa);
        String dec31st2020sb = "2020-12-31";
        Date dec31st2020d = convertYYYYMMDDStr(dec31st2020sb);
        String dec31st2020sa = formatDateToStrWithSDF(dec31st2020d, sdfdmy);
        out.println(dec31st2020sb);
        out.println(dec31st2020d);
        out.println(dec31st2020sa);
    }
}

এটি ভাল: yyy

হ্যাঁ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.