পরিচয়
SimpleDateFormat বিন্যাস এবং পার্স java.util.Date কাস্টম প্যাটার্ন স্ট্রিং ব্যবহার করে মান, এবং DateFormat লোকেল-সচেতন তারিখ এবং সময় বিন্যাসের জন্য বিমূর্ত বেস API প্রদান করে। আপনি যখন java.util.Date এর উপর নির্ভর করে এমন লিগ্যাসি জাভা কোড বজায় রাখার সময় এই APIগুলি ব্যবহার করুন; নতুন কোডের জন্য, DateTimeFormatter পছন্দ করুন Java 8+ তারিখ/সময় API থেকে কারণ SimpleDateFormat থ্রেড-নিরাপদ নয়।
এই টিউটোরিয়ালটি দেখায় কিভাবে DateFormat ব্যবহার করতে হয় এবং SimpleDateFormat ফরম্যাটিং, পার্সিং, টাইমজোন কনভার্সন এবং লোকেল-নির্দিষ্ট আউটপুটের জন্য। এটি setLenient(false) এর সাথে কঠোর বৈধতাও কভার করে , থ্রেড নিরাপত্তা সমাধান, এবং DateTimeFormatter এ একটি ব্যবহারিক স্থানান্তর পথ .
প্রধান টেকওয়ে
DateFormatহল বিমূর্ত ফর্ম্যাটিং API, এবংSimpleDateFormatপ্যাটার্ন-ভিত্তিক ফরম্যাটিং এবং পার্সিং
র জন্য সুনির্দিষ্ট বাস্তবায়ন SimpleDateFormatবছর, মাস, দিন, সময় ক্ষেত্র এবং টাইমজোন আউটপুটের জন্য সমৃদ্ধ প্যাটার্ন টোকেন সমর্থন করে- একটি ভাগ করা
SimpleDateFormatইনস্ট্যান্স মাল্টিথ্রেডেড কোডে অনিরাপদ কারণ এর অভ্যন্তরীণ অবস্থা পরিবর্তনযোগ্য ThreadLocal<SimpleDateFormat>যখন লিগ্যাসি কোড অবিলম্বে স্থানান্তর করতে পারে না
প্রতি থ্রেডের ফর্ম্যাটার দৃষ্টান্তগুলিকে আলাদা করে৷ DateTimeFormatterঅপরিবর্তনীয় এবং থ্রেড-নিরাপদ, তাই এটি নতুন জাভা কোডের জন্য পছন্দের প্রতিস্থাপন.parse()ParseExceptionনিক্ষেপ করতে পারে , তাই পার্সিং কোড ট্রাই-ক্যাচ এবং দরকারী ত্রুটি বার্তা ব্যবহার করা উচিতsetLenient(false)নিঃশব্দে সামঞ্জস্য করা অবৈধ তারিখগুলিকে বাধা দেয়, যেমন2024-13-45- সর্বদা একটি স্পষ্ট
Localeপাস করুন সার্ভার স্থাপনায় পরিবেশ-নির্ভর আউটপুট এড়াতে
জাভাতে SimpleDateFormat কি?
SimpleDateFormat হল DateFormat সাবক্লাস যা আপনাকে জাভাতে ফরম্যাটিং এবং পার্স করার জন্য সুস্পষ্ট তারিখ/সময় প্যাটার্ন নির্ধারণ করতে দেয়।
DateFormat ব্যবহার করুন যখন আপনি ফ্যাক্টরি পদ্ধতির মাধ্যমে স্টাইল-ভিত্তিক, লোকেল-সচেতন আউটপুট চান এবং SimpleDateFormat ব্যবহার করুন যখন আপনার সঠিক প্যাটার্ন নিয়ন্ত্রণের প্রয়োজন হয় যেমন "dd-MM-yyyy" অথবা "yyyy-MM-dd'T'HH:mm:ssZ" . DateFormat শৈলী ধ্রুবক (SHORT , MEDIUM , LONG , FULL ) আপনাকে সঠিক আঞ্চলিক তারিখের ক্রম জানার প্রয়োজন ছাড়াই লোকেল-উপযুক্ত আউটপুট তৈরি করে, যা ব্যবহারকারী-মুখী ডিসপ্লে স্ট্রিংগুলির জন্য দরকারী যেখানে বিন্যাসটি ব্যবহারকারীর লোকেল নিয়ম অনুসরণ করা উচিত। SimpleDateFormat ব্যবহার করুন যখন আউটপুট ফরম্যাট একটি বাহ্যিক প্রয়োজনীয়তা যেমন একটি API চুক্তি, একটি লগ বিন্যাস, বা একটি ফাইল নামকরণ কনভেনশন দ্বারা স্থির করা হয়, কারণ সেই ক্ষেত্রে লোকেল নির্বিশেষে একটি সঠিক প্যাটার্নের প্রয়োজন হয়৷
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Locale locale = Locale.US;
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
String styleBased = dateFormat.format(new Date());
SimpleDateFormat patternBased = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", locale);
String patternOutput = patternBased.format(new Date());
System.out.println(styleBased);
System.out.println(patternOutput);
Jan 5, 2026
05-01-2026 14:30:22
new Locale(String, String) জাভা 19-এ অবচয় করা হয়েছে। Locale.Builder ব্যবহার করুন পরিবর্তে।
Locale locale = new Locale.Builder()
.setLanguage("en")
.setRegion("US")
.build();
তারিখের পরিবর্তে সময় ফর্ম্যাট করতে, DateFormat.getTimeInstance() ব্যবহার করুন একই লোকেল এবং স্টাইল প্যারামিটার সহ।
Locale locale = Locale.US;
DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
System.out.println(timeFormat.format(new Date()));
Output depends on the current time and timezone, for example:
2:30:45 PM
আধুনিক জাভা তারিখ/সময় API-এর বিস্তৃত ওভারভিউয়ের জন্য, উদাহরণ সহ Java 8 তারিখ, লোকালডেট, লোকালডেটটাইম, ইনস্ট্যান্ট এবং জাভা 8 বৈশিষ্ট্যগুলি দেখুন৷
SimpleDateFormat প্যাটার্ন সিনট্যাক্স রেফারেন্স
SimpleDateFormat প্যাটার্ন অক্ষরগুলি তারিখ/সময়ের উপাদানগুলিতে সরাসরি ম্যাপ করে এবং সঠিক প্যাটার্ন নির্বাচন আউটপুট ফর্ম্যাট এবং পার্স আচরণ উভয়ই নিয়ন্ত্রণ করে৷
G যুগ মনোনীত G AD y বছরyyyy 2026 M বছরে মাসেMMMM January w বছরের সপ্তাহেw 3 W মাসে সপ্তাহেW 1 D বছরে দিনD 15 d মাসে দিনdd 05 F মাসে সপ্তাহের দিনF 1 E সপ্তাহে দিনের নামEEE Mon u সপ্তাহে দিনের সংখ্যা (1 = Monday )u 1 a AM/PM মার্কারa PM H দিনে ঘণ্টায় (0-23 )HH 14 k দিনে ঘন্টা (1-24 )k 14 K am/pm-এ ঘন্টা (0-11 )K 2 h am/pm-এ ঘন্টা (1-12 )hh 02 m ঘণ্টায় মিনিটmm 30 s মিনিটে সেকেন্ডss 45 S মিলিসেকেন্ডSSS 123 z সাধারণ টাইমজোনz IST Z RFC 822 টাইমজোন অফসেটZ +0530 X ISO 8601 টাইমজোন অফসেটXXX +05:30 প্যাটার্ন পুনরাবৃত্তি এবং আউটপুট প্রস্থ
বারবার প্যাটার্নের অক্ষরগুলি প্রস্থ, সাংখ্যিক প্যাডিং, বা পাঠ্য শৈলী পরিবর্তন করে।
M 1 মাসMM 01 মাসMMM Jan মাসMMMM January মাসের দিনd 5 মাসের দিনdd 05 ঘন্টা (0-23 )H 7 ঘন্টা (0-23 )HH 07 বছরyy 26 বছরyyyy 2026 প্রত্যাশিত আউটপুট সহ সাধারণ প্যাটার্ন উদাহরণ
এই সাধারণ প্যাটার্নগুলি লগ, API এবং ব্যবহারকারীর মুখোমুখি তারিখের জন্য দরকারী৷
MM/dd/yyyy 01/05/2026 dd-M-yyyy hh:mm:ss 05-1-2026 02:30:45 dd MMMM yyyy 05 January 2026 dd MMMM yyyy zzzz 05 January 2026 India Standard Time E, dd MMM yyyy HH:mm:ss z Mon, 05 Jan 2026 14:30:45 IST কিভাবে SimpleDateFormat ব্যবহার করে একটি তারিখ ফর্ম্যাট করবেন
একটি Date ফর্ম্যাট করতে , একটি SimpleDateFormat তৈরি করুন একটি প্যাটার্ন এবং কল করুন .format(date) .
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date now = new Date();
SimpleDateFormat basic = new SimpleDateFormat("MM-dd-yyyy", Locale.US);
SimpleDateFormat withTime = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.US);
SimpleDateFormat isoLike = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
System.out.println(basic.format(now));
System.out.println(withTime.format(now));
System.out.println(isoLike.format(now));
01-05-2026
05-01-2026 14:30:45
2026-01-05T14:30:45+0000
SimpleDateFormat ফর্ম্যাটার ইন্সট্যান্স থেকে টাইমজোন এবং লোকেল নিয়ম প্রযোজ্য, তাই যখন আউটপুট সামঞ্জস্যপূর্ণ হতে হবে তখন সেই মানগুলি স্পষ্টভাবে সেট করুন৷
কিভাবে SimpleDateFormat ব্যবহার করে একটি তারিখে একটি স্ট্রিং পার্স করবেন
একটি স্ট্রিংকে Date-এ পার্স করতে , সঠিক ইনপুট প্যাটার্ন সহ একটি ফর্ম্যাটার তৈরি করুন এবং .parse(input) কল করুন .
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
try {
SimpleDateFormat dateParser = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
Date parsedDate = dateParser.parse("05-01-2026");
System.out.println(parsedDate);
SimpleDateFormat timeParser = new SimpleDateFormat("HH:mm:ss", Locale.US);
Date parsedTime = timeParser.parse("22:15:09");
System.out.println(parsedTime);
} catch (ParseException e) {
e.printStackTrace();
}
Mon Jan 05 00:00:00 UTC 2026
Thu Jan 01 22:15:09 UTC 1970
যদি শুধুমাত্র সময় দেওয়া হয়, জাভা তারিখের অংশ হিসাবে যুগের তারিখ ব্যবহার করে।
পার্সএক্সেপশন সঠিকভাবে পরিচালনা করা
parse() থ্রো ParseException যখন ইনপুট কনফিগার করা প্যাটার্নের সাথে মেলে না, তাই প্রোডাকশন কোডটি ধরা উচিত এবং কাঁচা ইনপুট এবং প্রত্যাশিত প্যাটার্ন উভয়ই লগ করা উচিত।
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String input = "31/01/2026";
String pattern = "dd-MM-yyyy";
SimpleDateFormat parser = new SimpleDateFormat(pattern, Locale.US);
try {
parser.parse(input);
System.out.println("Parsed successfully");
} catch (ParseException e) {
// Include both the input value and pattern for easier debugging.
System.err.println("Failed to parse date string: " + input);
System.err.println("Expected pattern: " + pattern);
System.err.println("Parser error: " + e.getMessage());
}
Failed to parse date string: 31/01/2026
Expected pattern: dd-MM-yyyy
Parser error: Unparseable date: "31/01/2026"
ব্যতিক্রম হ্যান্ডলিং প্যাটার্নের জন্য আপনি পরিষেবা জুড়ে পুনরায় ব্যবহার করতে পারেন, Java এবং Java 8 তারিখ, LocalDate, LocalDateTime, Instant-এ ব্যতিক্রম হ্যান্ডলিং দেখুন৷
পার্স করার আগে তারিখ স্ট্রিং যাচাই করা হচ্ছে
SimpleDateFormat ডিফল্টরূপে নম্র, তাই অবৈধ মানগুলি ব্যর্থ হওয়ার পরিবর্তে রোল ওভার করতে পারে; setLenient(false) কল করুন কঠোর বৈধতা প্রয়োগ করতে।
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String invalid = "2024-13-45";
SimpleDateFormat lenientParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
SimpleDateFormat strictParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
strictParser.setLenient(false);
System.out.println("Lenient parse result:");
try {
// Lenient mode silently rolls over invalid values instead of throwing.
System.out.println(lenientParser.parse(invalid));
} catch (ParseException e) {
System.out.println("ParseException: " + e.getMessage());
}
System.out.println("Strict parse result:");
try {
System.out.println(strictParser.parse(invalid));
} catch (ParseException e) {
System.out.println("ParseException: " + e.getMessage());
}
Lenient parse result:
Fri Feb 14 00:00:00 UTC 2025
Strict parse result:
ParseException: Unparseable date: "2024-13-45"
SimpleDateFormat এ টাইমজোন হ্যান্ডলিং
SimpleDateFormat একই Date রেন্ডার করতে পারে আউটপুটের আগে ফরম্যাটারে একটি টাইমজোন সেট করে বিভিন্ন টাইমজোনে। একটি Date অবজেক্ট শুধুমাত্র একটি UTC মিলিসেকেন্ড গণনা সঞ্চয় করে এবং এর নিজস্ব কোনো টাইমজোন বহন করে না। টাইমজোন একটি ফর্ম্যাটিং উদ্বেগ, স্টোরেজ উদ্বেগ নয়; একই Date মান বিভিন্ন মানব-পঠনযোগ্য আউটপুট তৈরি করে যা ফর্ম্যাটারটি কোন টাইমজোন প্রযোজ্য তার উপর নির্ভর করে। এর মানে setTimeZone() format() এর আগে ফরম্যাটারে কল করতে হবে বলা হয়; এটি পরে সেট করা ইতিমধ্যে উত্পাদিত আউটপুট উপর কোন প্রভাব নেই.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
Date timestamp = new Date(1700000000000L); // Fixed instant for repeatable output
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("New York: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println("Kolkata: " + formatter.format(timestamp));
UTC: 2023-11-14 22:13:20 +0000
New York: 2023-11-14 17:13:20 -0500
Kolkata: 2023-11-15 03:43:20 +0530
গভীর টাইমজোন রূপান্তর প্যাটার্নের জন্য জাভা তারিখকে নির্দিষ্ট টাইমজোন ফর্ম্যাটে কীভাবে রূপান্তর করবেন তা দেখুন৷
সাধারণ টাইমজোন ভুল এবং কীভাবে সেগুলি এড়ানো যায়
টাইমজোন বাগগুলি প্রায়ই রেন্ডার করা স্থানীয় সময়ের সাথে বিভ্রান্তিকর সঞ্চিত তাত্ক্ষণিক থেকে আসে৷
DateUTC মিলিসেকেন্ড সঞ্চয় করে, এবং টাইমজোন শুধুমাত্র ফর্ম্যাট করার সময় প্রয়োগ করা হয়- কল করা হচ্ছে
setTimeZone()একটি মাল্টিথ্রেডেড এনভায়রনমেন্টে শেয়ার করা ফরম্যাটার ইনস্ট্যান্স অন্য থ্রেডের সিন-ফ্লাইট কলের জন্য টাইমজোন মিড-অপারেশন পরিবর্তন করতে পারে, কোন ব্যতিক্রম ছাড়াই ভুল টাইমজোনে আউটপুট তৈরি করে - একটি
SimpleDateFormatপুনরায় ব্যবহার করা aservlet বা স্প্রিং কন্ট্রোলারে HTTP অনুরোধ জুড়ে উদাহরণ একটি অনুরোধের কারণ হতে পারেsetTimeZone()অন্য অনুরোধের আউটপুটকে প্রভাবিত করতে কল; অনুরোধ প্রতি একটি নতুন উদাহরণ তৈরি করুন বাThreadLocal<SimpleDateFormat>ব্যবহার করুন রাষ্ট্রকে বিচ্ছিন্ন করতে TimeZone.getTimeZone("Invalid/Zone")নিঃশব্দে GMT-এ ফিরে আসে কারণ পদ্ধতি চুক্তিতে GMT-কে অচেনা আইডির জন্য ডিফল্ট হিসেবে উল্লেখ করা হয়, ব্যতিক্রম না করে-
ZoneId.of()দিয়ে জোন আইডি যাচাই করুনjava.timeথেকে তাদেরTimeZone.getTimeZone()-এ পাস করার আগে;ZoneId.of()থ্রোZoneRulesExceptionএকটি অবৈধ আইডিতে, যা সমস্যাটিকে স্পষ্ট করে তোলে
স্থানীয়-সচেতন তারিখ বিন্যাস
ফরাসি মাসের নাম বা জার্মান দিনের নামগুলির মতো লোকেল-নির্দিষ্ট তারিখ আউটপুট তৈরি করতে, একটি Locale পাস করুন SimpleDateFormat-এ নির্মাণকারী অন্তর্নির্মিত ধ্রুবকগুলি ব্যবহার করুন, Locale.US , Locale.UK , Locale.FRENCH , Locale.GERMAN , সাধারণ অঞ্চলের জন্য, অথবা Locale.Builder দিয়ে একটি কাস্টম লোকেল তৈরি করুন যখন আপনার ধ্রুবক দ্বারা আচ্ছাদিত না একটি অঞ্চল প্রয়োজন. Locale মাসের নাম, দিনের নাম এবং AM/PM মার্কারগুলির মতো পাঠ্য ক্ষেত্রের জন্য কোন ভাষা ব্যবহার করা হয় তা নিয়ন্ত্রণ করে৷
সিম্পলডেট ফরম্যাট কনস্ট্রাক্টরে লোকেল নির্দিষ্ট করা
একটি Locale পাস করুন দ্বিতীয় কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে। যদি আপনি এটি বাদ দেন, SimpleDateFormat Locale.getDefault() কল করে অভ্যন্তরীণভাবে, যা JVM-এর রানটাইম লোকেলে ফর্ম্যাটারকে আবদ্ধ করে, একটি মান যা ডেভেলপার মেশিন, CI পরিবেশ এবং বিভিন্ন OS লোকেল কনফিগারেশনের অধীনে চলমান প্রোডাকশন সার্ভারের মধ্যে আলাদা।
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date sample = new Date(1700000000000L);
String pattern = "EEEE, dd MMMM yyyy";
SimpleDateFormat usFormatter = new SimpleDateFormat(pattern, Locale.US);
SimpleDateFormat frFormatter = new SimpleDateFormat(pattern, Locale.FRENCH);
String usDate = usFormatter.format(sample);
String frDate = frFormatter.format(sample);
System.out.println("US: " + usDate);
System.out.println("French: " + frDate);
US: Tuesday, 14 November 2023
French: mardi, 14 novembre 2023
অঞ্চল অনুসারে মাস এবং দিনের নাম ফর্ম্যাটিং
একই প্যাটার্ন লোকেল দ্বারা বিভিন্ন টেক্সট আউটপুট তৈরি করে।
Locale.US EEEE, dd MMMM yyyy Tuesday, 14 November 2023 Locale.FRENCH EEEE, dd MMMM yyyy mardi, 14 novembre 2023 Locale.GERMAN EEEE, dd MMMM yyyy Dienstag, 14 November 2023
Locale.getDefault() এর উপর নির্ভর করা সার্ভার পরিবেশে চলমান JVM-এ অসামঞ্জস্যপূর্ণ আউটপুট তৈরি করতে পারে কারণ OS লোকেল সেটিংস হোস্ট জুড়ে আলাদা। সর্বদা একটি স্পষ্ট Locale পাস করুন .
SimpleDateFormat এর সাথে থ্রেড নিরাপত্তা সমস্যা
কেন SimpleDateFormat থ্রেড-নিরাপদ নয়
SimpleDateFormat অভ্যন্তরীণ Calendar পরিবর্তন করে এবং NumberFormat পার্স/ফর্ম্যাট অপারেশন চলাকালীন অবস্থা। যদি একাধিক থ্রেড একটি উদাহরণ ব্যবহার করে, এই পরিবর্তনযোগ্য ক্ষেত্রগুলি মধ্য-অপারেশনের উপর ওভাররাইট করা যেতে পারে, যা রেসের অবস্থা এবং অপ্রত্যাশিত আউটপুট সৃষ্টি করে। অনুশীলনে এটি একটি থ্রেডের তারিখ হিসাবে অন্য থ্রেডের ফলাফলে প্রদর্শিত হয়, .parse() কোনো ব্যতিক্রম ছাড়াই সম্পূর্ণ ভুল তারিখ ফেরত দেওয়া, অথবা একটি ArrayIndexOutOfBoundsException ফর্ম্যাটার নিজেই ভিতর থেকে নিক্ষিপ্ত. এই ব্যর্থতাগুলি বিরতিমূলক এবং লোড-নির্ভর, যা তাদেরকে একক-থ্রেডেড পরীক্ষার পরিবেশে পুনরুত্পাদন করা কঠিন করে তোলে।
আপনার যখন লিগ্যাসি কোডে একযোগে-নিরাপদ বিন্যাসনের প্রয়োজন হয়, থ্রেড বা অনুরোধের সুযোগ দ্বারা দৃষ্টান্তগুলিকে আলাদা করুন৷ জাভা থ্রেডিং আচরণের পটভূমির জন্য, জাভা থ্রেড উদাহরণ দেখুন।
ThreadLocal ব্যবহার করে SimpleDateFormat দৃষ্টান্তগুলিকে বিচ্ছিন্ন করতে
ThreadLocal<SimpleDateFormat> প্রতিটি থ্রেড তার নিজস্ব ফর্ম্যাটার উদাহরণ দেয় এবং ভাগ করা পরিবর্তনযোগ্য অবস্থা এড়িয়ে যায়। থ্রেড-পুল পরিবেশে যেমন সার্লেট কন্টেইনার এবং স্প্রিং অ্যাপ্লিকেশন, থ্রেডগুলি অনুরোধ জুড়ে পুনরায় ব্যবহার করা হয় এবং কখনই বন্ধ করা হয় না, যার অর্থ ThreadLocal মানগুলি কখনই স্বয়ংক্রিয়ভাবে সরানো হয় না। সর্বদা FORMATTER.remove() কল করুন অপারেশন সম্পূর্ণ হওয়ার পরে, অথবা ফরম্যাটার উদাহরণটি থ্রেডের আজীবন টিকে থাকবে এবং টেকসই লোডের অধীনে মেমরি লিক হিসাবে জমা হবে৷
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ThreadSafeLegacyFormatter {
// Each thread gets one dedicated formatter instance.
private static final ThreadLocal<SimpleDateFormat> FORMATTER =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US));
public static String format(Date date) {
try {
// No cross-thread mutation because each thread reads its own formatter.
return FORMATTER.get().format(date);
} finally {
// Remove the instance after use to prevent memory leaks in thread pools.
FORMATTER.remove();
}
}
}
থ্রেড-নিরাপদ বিকল্প হিসেবে ডেটটাইম ফরম্যাটারে স্যুইচ করা হচ্ছে
DateTimeFormatter অপরিবর্তনীয় এবং থ্রেড-নিরাপদ, তাই একটি শেয়ার করা স্ট্যাটিক ইন্সট্যান্স নিরাপদ।
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
// Not thread-safe when shared across threads
SimpleDateFormat unsafe = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(unsafe.format(new Date()));
// Thread-safe: DateTimeFormatter is immutable and can be stored as a static field
DateTimeFormatter safe = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(safe.format(LocalDateTime.now()));
2026-01-05 14:30:22
2026-01-05 14:30:22
SimpleDateFormat থেকে DateTimeFormatter এ স্থানান্তরিত হচ্ছে
DateTimeFormatter-এ স্থানান্তর থ্রেড-নিরাপত্তা ঝুঁকি দূর করে, ThreadLocal দূর করে সমাধান, এবং java.time এর সাথে পরিষ্কারভাবে সংহত করে প্রকার বেশিরভাগ কোডবেসের জন্য মাইগ্রেশন যান্ত্রিক:প্যাটার্ন সিনট্যাক্স প্রায় অভিন্ন, দুটি এপিআই একটি ক্রমবর্ধমান রোলআউটের সময় সহাবস্থান করতে পারে এবং আপনাকে একবারে সবকিছু রূপান্তর করতে হবে না। প্রধান ঝুঁকি হল u প্রতীক, যার মানে SimpleDateFormat-এ সপ্তাহের দিন এবং DateTimeFormatter সালে; এটি পরীক্ষা না করে সরাসরি API-এর মধ্যে কপি করা নিদর্শনগুলি নীরবে ভুল আউটপুট তৈরি করবে৷
পাশাপাশি কোড তুলনা
এই পাশের স্নিপেটটি লিগ্যাসি এবং আধুনিক API-এ সমতুল্য ফর্ম্যাটিং এবং পার্সিং আচরণ দেখায়৷
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
String pattern = "yyyy-MM-dd";
String input = "2026-01-05";
// SimpleDateFormat (legacy java.util.Date API)
SimpleDateFormat legacyFormatter = new SimpleDateFormat(pattern, Locale.US);
Date legacyParsed = legacyFormatter.parse(input);
String legacyFormatted = legacyFormatter.format(new Date());
// DateTimeFormatter (modern java.time API)
DateTimeFormatter modernFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US);
LocalDate modernParsed = LocalDate.parse(input, modernFormatter);
String modernFormatted = modernFormatter.format(LocalDate.now());
System.out.println(legacyParsed);
System.out.println(legacyFormatted);
System.out.println(modernParsed);
System.out.println(modernFormatted);
Mon Jan 05 00:00:00 UTC 2026
2026-01-05
2026-01-05
2026-01-05
দুটি API-এর মধ্যে প্যাটার্ন সিনট্যাক্স পার্থক্য
বেশিরভাগ প্যাটার্ন অক্ষর একই রকম, তবে কিছু চিহ্ন আলাদা এবং সরাসরি কপি করা হলে মাইগ্রেশন ভাঙতে পারে।
yyyy uuuu অথবা yyyy uuuu পছন্দ করুন java.time-এ প্রলেপটিক বছরের সামঞ্জস্যের জন্য টাইমজোন অফসেট/নামz , Z , X z , Z , x , X java.time আরও অফসেট ভেরিয়েন্টকে আলাদা করে (x এবং X )আক্ষরিক পাঠ'T' 'T' উভয় APIই লিটারেলu এর জন্য একক উদ্ধৃতি ব্যবহার করে প্রতীক-সপ্তাহের দিন সংখ্যাবছর পরিচিত গোটা:u API-এর মধ্যে অর্থ পরিবর্তন করে ধাপে ধাপে মাইগ্রেশন চেকলিস্ট
বিদ্যমান কোডবেসগুলিতে একবারে একটি ফর্ম্যাটার রূপান্তর করতে এই চেকলিস্টটি ব্যবহার করুন৷
-
import java.text.SimpleDateFormat;প্রতিস্থাপন করুনimport java.time.format.DateTimeFormatter;সহ -
new SimpleDateFormat("yyyy-MM-dd")প্রতিস্থাপন করুনDateTimeFormatter.ofPattern("yyyy-MM-dd")সহ -
.parse()প্রতিস্থাপন করুনLocalDate.parse()সহ অথবাLocalDateTime.parse()ইনপুট নির্ভুলতার উপর নির্ভর করে -
.format(date)প্রতিস্থাপন করুনformatter.format(localDate)সহ অথবাformatter.format(localDateTime) -
new Date()সরান যেখানে সম্ভব এবংLocalDate.now()ব্যবহার করুন অথবাInstant.now()
DateTimeFormatter java.time এর সাথে একচেটিয়াভাবে কাজ করে প্রকারগুলি (LocalDate , LocalDateTime , ZonedDateTime , Instant ) এটি java.util.Date গ্রহণ করে না সরাসরি আপনার যদি কোড থাকে যা এখনও java.util.Date তৈরি করে মানগুলি, উদাহরণস্বরূপ একটি উত্তরাধিকারী ORM বা JDBC ড্রাইভার থেকে, প্রথমে date.toInstant() দিয়ে রূপান্তর করুন DateTimeFormatter এ পাস করার আগে . ক্রমবর্ধমান মাইগ্রেশনের সময় দুটি API একই কোডবেসে সহাবস্থান করতে পারে; আপনাকে একবারে সবকিছু রূপান্তর করতে হবে না। DateTimeFormatter এছাড়াও ParseException প্রতিস্থাপন করে java.time.format.DateTimeParseException সহ , যা একটি অচেক করা ব্যতিক্রম, তাই ট্রাই-ক্যাচ ব্লক ঐচ্ছিক হয়ে যায় কিন্তু এখনও প্রোডাকশন পার্সিং কোডে সুপারিশ করা হয়।
মাইগ্রেশন প্রসঙ্গ এবং টাইপ পছন্দের জন্য, Java 8 তারিখ, LocalDate, LocalDateTime, Instant দেখুন৷
প্রায়শই জিজ্ঞাসিত প্রশ্ন
জাভাতে SimpleDateFormat এবং DateFormat এর মধ্যে পার্থক্য কি?
DateFormat একটি বিমূর্ত শ্রেণী যা তারিখ/সময় বিন্যাসের জন্য চুক্তি সংজ্ঞায়িত করে। SimpleDateFormat এটির কংক্রিট সাবক্লাস যা কাস্টম প্যাটার্ন-ভিত্তিক বিন্যাসকে অনুমতি দেয়। আপনি SimpleDateFormat ব্যবহার করেন সরাসরি কোডে; আপনি DateFormat ব্যবহার করেন একটি রেফারেন্স টাইপ হিসাবে আপনি যখন কোনো বাস্তবায়ন গ্রহণ করতে চান।
সিম্পলডেটফরম্যাট কি থ্রেড-নিরাপদ?
না। SimpleDateFormat দৃষ্টান্তগুলি থ্রেড-নিরাপদ নয়। সিঙ্ক্রোনাইজেশন ছাড়াই থ্রেড জুড়ে একটি একক দৃষ্টান্ত শেয়ার করা অপ্রত্যাশিত পার্স এবং বিন্যাস ফলাফলের কারণ হয়। ThreadLocal<SimpleDateFormat> ব্যবহার করুন অথবা java.time.format.DateTimeFormatter দিয়ে প্রতিস্থাপন করুন , যা অপরিবর্তনীয় এবং থ্রেড-নিরাপদ।
আমি কিভাবে SimpleDateFormat ব্যবহার করে dd-MM-yyyy বিন্যাসে একটি তারিখ স্ট্রিং পার্স করব?
ইনস্ট্যান্টিয়েট SimpleDateFormat "dd-MM-yyyy" প্যাটার্ন সহ , তারপর .parse(yourString) কল করুন . ParseException-এর জন্য একটি ট্রাই-ক্যাচ ব্লকে কলটি মোড়ানো . বিভাজক অক্ষর সহ ইনপুট স্ট্রিং প্যাটার্নের সাথে হুবহু মেলে তা নিশ্চিত করুন৷
আমি কিভাবে SimpleDateFormat ব্যবহার করে একটি তারিখকে একটি ভিন্ন টাইমজোনে রূপান্তর করব?
.setTimeZone(TimeZone.getTimeZone("America/New_York")) কল করুন আপনার SimpleDateFormat-এ .format(date) কল করার আগে উদাহরণ . অন্তর্নিহিত Date বস্তু UTC মিলিসেকেন্ড ধারণ করে; ফর্ম্যাটারটি আউটপুটের সময় টাইমজোন অফসেট প্রয়োগ করে৷
"yyyy-MM-dd'T'HH:mm:ssZ" প্যাটার্নটি কী তৈরি করে?
এটি একটি ISO 8601-সামঞ্জস্যপূর্ণ টাইমস্ট্যাম্প তৈরি করে, উদাহরণস্বরূপ 2024-06-15T14:30:00+0530 . T একক উদ্ধৃতিতে মোড়ানো একটি আক্ষরিক অক্ষর। Z RFC 822 টাইমজোন অফসেট প্রতিনিধিত্ব করে।
আমি কিভাবে SimpleDateFormat থেকে DateTimeFormatter এ স্থানান্তর করব?
new SimpleDateFormat("yyyy-MM-dd") প্রতিস্থাপন করুন DateTimeFormatter.ofPattern("yyyy-MM-dd") সহ . .parse() প্রতিস্থাপন করুন LocalDate.parse() দিয়ে কল করে অথবা LocalDateTime.parse() . .format(date) প্রতিস্থাপন করুন formatter.format(localDate) দিয়ে কল করে . মনে রাখবেন যে DateTimeFormatter u ব্যবহার করে বছরের জন্য কিছু প্রসঙ্গে y এর পরিবর্তে .
কেন SimpleDateFormat একটি ব্যতিক্রম ছাড়াই একটি অবৈধ তারিখ পার্স করে?
ডিফল্টরূপে, SimpleDateFormat উদার পার্সিং মোড ব্যবহার করে, যা পরিসীমার বাইরের মানগুলিকে প্রত্যাখ্যান করার পরিবর্তে সামঞ্জস্য করে। .setLenient(false) কল করুন কঠোর বৈধতা প্রয়োগ করার জন্য পার্স করার আগে এবং ParseException নিক্ষেপ করুন অবৈধ ইনপুটে।
আমি কিভাবে SimpleDateFormat ব্যবহার করে একটি নির্দিষ্ট লোকেলের সাথে একটি তারিখ ফর্ম্যাট করব?
Locale পাস করুন কনস্ট্রাক্টরের কাছে দ্বিতীয় যুক্তি হিসাবে:new SimpleDateFormat("dd MMMM yyyy", Locale.FRENCH) . এটি নির্দিষ্ট ভাষায় মাস এবং দিনের নাম রেন্ডার করে, যা একাধিক অঞ্চলে পরিবেশন করা অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ৷
উপসংহার
এই নির্দেশিকাটি DateFormat কভার করেছে এবং SimpleDateFormat ফান্ডামেন্টাল, প্যাটার্ন সিনট্যাক্স, ফরম্যাটিং এবং পার্সিং ওয়ার্কফ্লো, টাইমজোন আচরণ, লোকেল-সচেতন রেন্ডারিং, থ্রেড নিরাপত্তা সমস্যা, এবং DateTimeFormatter-এ মাইগ্রেশন .
আপনি এখন লিগ্যাসি এবং আধুনিক কোডের জন্য সঠিক ফরম্যাটার বেছে নিতে পারেন, কঠোর বৈধতার সাথে ইনপুটকে রক্ষণাত্মকভাবে পার্স করতে পারেন, সার্ভার পরিবেশে লোকেল এবং টাইমজোন ড্রিফ্ট এড়াতে পারেন এবং ভাগ করা তারিখ ফর্ম্যাটারগুলি থেকে একযোগে ঝুঁকিগুলি সরিয়ে দিতে পারেন৷
পরবর্তী ধাপগুলির জন্য, Java 8 তারিখ, LocalDate, LocalDateTime, Instant, Java 8 বৈশিষ্ট্যগুলি উদাহরণ সহ পর্যালোচনা করুন, জাভাতে ব্যতিক্রম হ্যান্ডলিং এবং জাভা অ্যাপ্লিকেশনগুলিতে তারিখ/সময় পরিচালনার আধুনিকীকরণ চালিয়ে যাওয়ার জন্য জাভা তারিখকে নির্দিষ্ট টাইমজোন ফর্ম্যাটে কীভাবে রূপান্তর করা যায়৷
রেফারেন্স:
- SimpleDateFormat API ডক
- তারিখ ফরম্যাট API ডক
- DateTimeFormatter API ডক
এই ক্রিয়েটিভ লাইসেন্সের অধীনে কাজ করে" অ্যাট্রিবিউশন-অবাণিজ্যিক- শেয়ারঅ্যালাইক 4.0 আন্তর্জাতিক লাইসেন্স।