জাভাতে সময় ছাড়া আমি কীভাবে একটি তারিখ পেতে পারি?


235

টাইমস্ট্যাম্প ছাড়াই বর্তমান তারিখ পাওয়ার জন্য স্ট্যাক ওভারফ্লো প্রশ্ন জাভা প্রোগ্রাম থেকে চালিয়ে যাওয়া :

সময় ছাড়াই ডেট অবজেক্ট পাওয়ার সর্বাধিক দক্ষ উপায় কী? এই দুটি ছাড়া আর কোন উপায় আছে কি?

// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));

// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();

আপডেট :

  1. আমি জোদা-সময় সম্পর্কে জানতাম ; আমি এই জাতীয় একটি সহজ (আমি মনে করি) কাজের জন্য অতিরিক্ত লাইব্রেরি এড়াতে চেষ্টা করছি। তবে এখনও পর্যন্ত উত্তরগুলির ভিত্তিতে জোদা-সময় অত্যন্ত জনপ্রিয় বলে মনে হচ্ছে, তাই আমি এটি বিবেচনা করতে পারি।

  2. দক্ষতার দ্বারা , আমি বলতে চাইছি আমি সাময়িক অবজেক্ট Stringতৈরির মাধ্যমে যেমন ব্যবহার করতে চাই তা এড়াতে চাই method 1, ইতিমধ্যে method 2সমাধানের পরিবর্তে হ্যাকের মতো মনে হচ্ছে।


1
দক্ষ? যেমন মেথড 1 অনুসারে কী সরবরাহ করা হয়েছে তার চেয়ে বেশি দক্ষতার দরকার আছে?
জোহান সিজবার্গ

2
"দক্ষ" বলতে কী বোঝ? একটি তারিখটি মূলত একটি টাইপ করা দীর্ঘ, আপনি এর চেয়ে কম স্মৃতিতে সত্যই এটি করতে পারবেন না। আপনি যদি "সুবিধাজনক" বলতে চান, জোডা সময় হ'ল উপায়।
মিলিমুজ

3
+1 ঠিক আমার কাছে প্রশ্ন ছিল।
আলবা মেন্ডেজ

1
আমি পদ্ধতি 2 পছন্দ করি একটি ইউটিলিটি ক্লাসে একটি স্ট্যাটিক পদ্ধতি তৈরি করুন এবং কেবল এটি ব্যবহার করুন। আমি বছরের পর বছর ধরে এই পন্থা করছি।
উইলসন ফ্রেইটাস

1
আপনার "আপডেট 1" তে নিতপিকিং: এটি যদি "এত সাধারণ কাজ" হত তবে আমার ধারণা সান এমন ভয়াবহ এবং অদক্ষ এপিআইতে আসেনি, এবং আপনি (এবং অন্যান্য অনেক লোক) এই প্রশ্নটি জিজ্ঞাসা করবেন না আদৌ ;-)
ফ্লাভিও এরটস্কো

উত্তর:


108

আপনি একেবারে না আছে ব্যবহারের java.util.Date? আমি চাই পুঙ্খানুপুঙ্খভাবে সুপারিশ করছি যে আপনি ব্যবহার Joda সময় বা java.timeজাভা 8 পরিবর্তে থেকে প্যাকেজ। বিশেষ করে, যখন তারিখ এবং ক্যালেন্ডার সবসময় সময় একটি নির্দিষ্ট তাত্ক্ষণিক, যেমন "শুধু একটি তারিখ" এমন কোন ধারণার সঙ্গে প্রতিনিধিত্ব, Joda সময় আছে (একটি টাইপ এই প্রতিনিধিত্বমূলক আছেLocalDate )। আপনার কোডটি আরও পরিষ্কার হবে যদি আপনি এমন ধরণের ব্যবহার করতে সক্ষম হন যা আপনি আসলে যা করার চেষ্টা করছেন তা উপস্থাপন করে।

জোডা সময় বা java.timeঅন্তর্নির্মিত java.utilপ্রকারের পরিবর্তে ব্যবহারের আরও অনেক কারণ রয়েছে - এগুলি সাধারণত আরও ভাল এপিআই। java.util.Dateআপনার নিজের কোডের সীমানায় সর্বদা / থেকে একটিতে রূপান্তর করতে পারেন যদি আপনার প্রয়োজন হয়, উদাহরণস্বরূপ ডাটাবেস মিথস্ক্রিয়তার জন্য।


75
এন্টারপ্রাইজ অ্যাপ্লিকেশনগুলিতে আমাদের কাছে সবসময় অন্যান্য লাইব্রেরি যুক্ত / ব্যবহার করার বিকল্প থাকে না। আমি জোডা টাইমটির পয়েন্টারটির প্রশংসা করি, তবে এটি স্ট্যান্ডার্ড জাভা ব্যবহার করে তারিখের অংশ পাওয়ার মূল সমস্যাটির উত্তর নয়। ধন্যবাদ। চথুরাঙ্গার উত্তরকে সমর্থন করে।
noogrub

3
@ নুগ্রুব: চথুরাঙ্গার উত্তরটি মূল প্রশ্নের উত্তর দেয় না, যা কোনও Dateবস্তু কীভাবে পাবেন সে সম্পর্কে জিজ্ঞাসা করছে - যে উত্তরটি তারিখটিকে একটি স্ট্রিংয়ে ফর্ম্যাট করে , যা একই জিনিস নয়। মৌলিকভাবে, কোন তারিখটি রয়েছে তা জিজ্ঞাসা করা Dateআরও তথ্য ছাড়া অর্থহীন প্রশ্ন: সময় অঞ্চল এবং আপনি যে ক্যালেন্ডার সিস্টেমটি ব্যবহার করছেন তা।
জন স্কিটি

7
"এন্টারপ্রাইজ অ্যাপ্লিকেশনগুলিতে আমাদের কাছে সবসময় অন্যান্য লাইব্রেরি যুক্ত / ব্যবহার করার বিকল্প থাকে না"। সত্যি? আপনি কি পরামর্শ দিচ্ছেন যে আপনি মোটে তৃতীয় পক্ষের libs ব্যবহার করতে পারবেন না?
ব্রায়ান অগ্নিউ

3
@ ব্রায়ান অ্যাগনিউ নোগ্রাবের মন্তব্যটি প্রযুক্তিবিহীন প্রতিবন্ধকতার সাথে সম্পর্কিত বলে মনে হচ্ছে, আমি মনে করি
জোসে_জিডি

3
আজকের দৃষ্টিকোণ থেকে: " জাভা -টাইম জাভা-এসই ৮ এর আগে জাভা-র জন্য আদর্শ মানের তারিখ এবং সময় গ্রন্থাগার Users ব্যবহারকারীদের এখন জাভা.টাইমে (জেএসআর -310) স্থানান্তর করতে বলা হয়।"
Drux

66

আমি আজকের তারিখটি নির্ধারিত সময়ের সাথে এখানে পেয়েছি 00:00:00:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

Date today = new Date();

Date todayWithZeroTime = formatter.parse(formatter.format(today));

28
মূল প্রশ্নে এটি ইতিমধ্যে প্রস্তাবিত "পদ্ধতি 1" থেকে কীভাবে আলাদা?
ক্রিস

এটি কোন টাইমজোনটি ঘটে তা সম্বোধন করে না (জেভিএমের স্বেচ্ছাসেবী ডিফল্ট টাইমজোন থেকে বামে)।
ড্যারেল টিগু

58

আপনি অ্যাপাচি কমন্স লাইব্রেরি থেকে ডেট ইউটিলস.ট্রানসেট ব্যবহার করতে পারেন ।

উদাহরণ:

DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)

3
আপনি যদি একটি নতুন লাইব্রেরি যুক্ত করতে চলেছেন তবে এটি অ্যাপাচি কমন্সের পরিবর্তে জোদা হতে দিন।
ডিব্বেকে

6
+1 @ ডিবিবেক পার্থক্য কেবল এই নয় যে আপনি অন্যটির পরিবর্তে একটি লাইব্রেরি যুক্ত করবেন। কখনও কখনও কেউ কেবল একটি তারিখ থেকে সময় কেটে দেওয়ার তুচ্ছ কাজের জন্য একটি সম্পূর্ণ নতুন লাইব্রেরি শিখতে চায় না। বা কখনও কখনও পূর্ব এবং কখনও কখনও পরেরটি ব্যবহার করে জোদা তারিখের সাথে তারিখ / ক্যালেন্ডারের সাথে মিশে এমন কোড থাকতে চায় না। বা এই ধরনের তুচ্ছ উদ্দেশ্যে অন্য কোনও লাইব্রেরির সাথে ভালভাবে কাজ করার তারিখ / ক্যালেন্ডার ভিত্তিক কোডটি প্রতিস্থাপন করতে / সমর্থন করতে পারে না। যদিও পরামর্শ Joda মধ্যে যেমন বাস্তব জীবনে কিক পরিষ্কারভাবে শ্রেয় কেবল রাইট আর, কখনও কখনও অবশ্যই ভাল।
SantiBailors

জিনিয়াস! আমাকে
প্রচুর

37

এই দুটি ছাড়া আর কোন উপায় আছে কি?

হ্যা এখানে.

LocalDate.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)

java.time

জাভা 8 এবং পরে অন্তর্নির্মিত নতুন জাভা.টাইম প্যাকেজটি আসে । টিউটোরিয়াল দেখুন । জাভা.টাইম কার্যকারিতাটির বেশিরভাগটি থ্রিটেন-ব্যাকপোর্টে জাভা 6 এবং 7 এ ব্যাক-পোর্ট করা হয় এবং আরও থ্রিডেএনএবিপিতে অ্যান্ড্রয়েডের সাথে অভিযোজিত ।

জোদা-টাইমের অনুরূপ , জাভা.টাইম একটি LocalDateশ্রেণীর অফার দেয় কেবলমাত্র তারিখের মানটি দিনের বেলা ছাড়াই এবং সময় অঞ্চল ছাড়াই represent

নোট করুন যে সময় অঞ্চলটি নির্দিষ্ট তারিখ নির্ধারণের জন্য গুরুত্বপূর্ণ critical প্যারিসের মধ্যরাতের স্ট্রোকে, উদাহরণস্বরূপ, মন্ট্রিয়ালে তারিখটি এখনও "গতকাল" is

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

ডিফল্টরূপে, জাভা.টাইম একটি তারিখ বা তারিখ-সময় মানের স্ট্রিং উপস্থাপনা তৈরি করতে আইএসও 8601 স্ট্যান্ডার্ড ব্যবহার করে । (জোডা-টাইমের সাথে আর একটি মিল So) সুতরাং toString()পাঠ্যটি উত্পন্ন করার জন্য কেবল কল করুন 2015-05-21

String output = today.toString() ; 

জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


1
সময় অঞ্চল উল্লেখ করার জন্য ধন্যবাদ । আমার কাছে এটি ঘটেনি যে "এটি কোন দিন" কোনও পরম ধারণা নয়।
টুলমেকারস্টেভ

@ টলমেকারস্টেভ তারিখ পাওয়া সর্বদা একটি সময় অঞ্চল জড়িত। তবে কৌশলটি হ'ল আপনি যদি কোনও সময় অঞ্চল নির্দিষ্ট করতে ব্যর্থ হন তবে আপনার জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি স্বয়ংক্রিয়ভাবে তারিখ নির্ধারণে প্রয়োগ করা হবে। তার উপরে, জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি যে কোনও মুহুর্তে পরিবর্তিত হতে পারে ! জেভিএম-এর মধ্যে যে কোনও অ্যাপের যে কোনও থ্রেডের যে কোনও কোড TimeZone.setDefaultরানটাইম চলাকালীন কল করতে পারে এবং তত্ক্ষণাত J জেভিএম-তে চলমান অন্যান্য সমস্ত কোডকে প্রভাবিত করে। গল্পের নৈতিকতা: সর্বদা একটি সময় অঞ্চল নির্দিষ্ট করুন।
তুলসী বাউরক

22

সবচেয়ে সোজা উপায়:

long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);

5
আমার জন্য এটি বর্তমানে: "শনিবার 19 ফেব্রুয়ারী 01 : 00: 00 সিইটি 2011"। আপনি যদি এটি ব্যবহার করতে চান তবে কেবল ইউটিসি দিয়ে।
ক্রিস Lerher

4
3 লাইন কি long dateOnly = (currentTime / millisInDay) * millisInDay;লেখার মতো নয় long dateOnly = currentTime;?
ক্রিস

5
এটি পূর্ণসংখ্যার গণিতের কারণে নয়। এটিকে আরও ম্যাথ.ফ্লুর (কারেন্টটাইম / মিলিসইনডে) * মিলিসইনডেয়ের মতো ভাবুন। সে কার্যকরভাবে সময়টি 00:00:00 এ নির্ধারণ করছে।
নিকোলাস ফ্লাইন্ট

2
এই সমাধানটি সম্ভবত বেশিরভাগ প্রয়োগের জন্যই ঠিক আছে তবে এই ধারণাকে সতর্ক করে দেওয়া উচিত যে কোনও দিনেই 60 * 60 * 24 * 1000 থাকে সর্বদা সত্য নয়। উদাহরণস্বরূপ আপনি কিছু দিনের মধ্যে লিপ সেকেন্ড রাখতে পারেন।
পিয়েরে-আন্তোইন

1
এটি অন্যান্য 1 এবং 2-লাইন পরিষ্কার এবং সংক্ষিপ্ত পদ্ধতিগুলির তুলনায় সবচেয়ে বিতর্কিত এবং প্রস্তাবিত উপায় নয় argu
ড্যারেল টিগু

22

এই প্রশ্নের স্ট্যান্ডার্ড উত্তর জোদা সময় ব্যবহার করা । এপিআই আরও ভাল এবং আপনি যদি ফরম্যাটারগুলি এবং পার্সার ব্যবহার করেন তবে থ্রেড সুরক্ষার অজ্ঞাত-স্বল্প অভাব এড়াতে পারবেন SimpleDateFormat

জোদা ব্যবহার করার অর্থ আপনি কেবল এটি করতে পারেন:

LocalDate d = new LocalDate();

হালনাগাদ:: জাভা 8 ব্যবহার করে এটি ব্যবহার করা যাবে ived

LocalDate date = LocalDate.now();

জাভা 8-এ নতুন জাভা.টাইম প্যাকেজটি LocalDateজোদা-টাইমের অনুরূপ ক্লাস সরবরাহ করে।
তুলসী বাউরক

1
আদর্শভাবে আপনি DateTimeZoneসেই লোকালডিট কনস্ট্রাক্টরকে একটি পাস করবেন । বর্তমান তারিখ নির্ধারণ করা সময় অঞ্চলের উপর নির্ভর করে, কারণ মন্ট্রিয়ালের চেয়ে প্যারিস নতুন তারিখ শুরু করে। আপনি সময় অঞ্চলটি বাদ দিলে আপনার জেভিএমের ডিফল্ট সময় অঞ্চলটি প্রয়োগ করা হবে। সাধারণত ডিফল্ট নির্ভর করার চেয়ে নির্দিষ্ট করা ভাল।
তুলসী বাউরক

8

এটি করার একটি সহজ উপায়:

Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));

4
এই উত্তরটি প্রশ্নের সমাধান করতে ব্যর্থ। বিন্যাসিত স্ট্রিং পাওয়া লক্ষ্য ছিল না।
বাসিল বার্ক

7

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

আপনি যদি মিলিসেকেন্ডের পরিবর্তে খেজুর দিয়ে কাজ করতে চান তবে আপনাকে অন্য কিছু ব্যবহার করতে হবে। জাভা 8 এর জন্য একটি নতুন সেট পদ্ধতি রয়েছে যা আপনি যা চান ঠিক তা সরবরাহ করে। জাভা 7 এর জন্য এবং তার আগে ব্যবহার করুন http://www.joda.org/joda-time/


3
দ্রষ্টব্য: "মধ্যরাতের তারিখ" বলার জন্য যে সমস্ত পন্থাগুলি দিবালোক সঞ্চয় সময় এবং একাধিক সময় অঞ্চল ভালভাবে পরিচালনা করে না।
থরবজর্ন রাভন অ্যান্ডারসন

আমি এটি নিশ্চিত করেছি, আমি আমার অ্যাপ্লিকেশনে একদিন তারিখ বাড়িয়েছিলাম, এবং ডিএসটি-র সাথে টাইমজোন (আমার দেশ ডিএসটি ব্যবহার করে না) ব্যবহারকারীদের কাছ থেকে বাগ রিপোর্টের মাধ্যমে এটি সম্পর্কে জানলাম। যেদিন ডিএসটি শুরু হয় সেদিনে আমার অ্যাপ্লিকেশনটি 12 এর পরিবর্তে 11 ঘন্টা যোগ করে? সম্ভবত "দুপুরের" তারিখের জন্য দুপুরের সময়টি আরও ভাল হয়?
জোসে_জিডি

1
@ জোসে_জিডি এটি এখনও একটি হ্যাক। আপনি youtube.com/watch?v=-5wpm-gesOY বিনোদনমূলক খুঁজে পেতে পারেন ।
থরবজর্ন রাভন অ্যান্ডারসন

@ থরবজর্ন, আপনি ঠিক বলেছেন, জোদাটাইম এড়াতে চেয়েছিলেন কারণ আমার জন্য কেবল একটি বৈশিষ্ট্য সাউন্ড ওভারকিলের জন্য একটি লাইব্রেরি যুক্ত করা। আমি ভিডিও সম্পর্কে জানতাম, সত্যিই মজার।
জোসে_জিডি

1
@ জোসে_জিডি মূল বক্তব্যটি ছিল যে আসল জীবন ব্যবহারের ক্ষেত্রে এমন একটি সমস্যা রয়েছে যাতে আপনার পদ্ধতির বিষয়টি বাগ হিসাবে বিবেচিত হবে। যদি আপনি এটির সন্ধান পান তবে আরও কিছু থাকতে পারে ... জোদা কীভাবে এটি পরিচালনা করে তা আমি জানি না তবে আপনি দেখতে পারেন। এছাড়াও নোট করুন যে জাভা 8 একটি নতুন তারিখ-সময় গ্রন্থাগার নিয়ে আসে (জোদার অভিজ্ঞতার ভিত্তিতে) যা আপনি সন্ধান করতে চান।
থরবজর্ন রাভন অ্যান্ডারসন

4

অবশ্যই সবচেয়ে সঠিক উপায় নয়, তবে সময় ছাড়া তারিখটি পাওয়ার জন্য যদি আপনার কেবলমাত্র দ্রুত সমাধানের প্রয়োজন হয় এবং আপনি তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার করতে চান না তবে এটি করা উচিত

    Date db = db.substring(0, 10) + db.substring(23,28);

আমার কেবল দর্শনের প্রয়োজনে তারিখের প্রয়োজন ছিল এবং জোদা তাই আমি সাবস্ক্রিনড করতে পারিনি।


4
// 09/28/2015
System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

// Mon Sep 28
System.out.println( new Date().toString().substring(0, 10) );

// 2015-09-28
System.out.println(new java.sql.Date(System.currentTimeMillis()));

// 2015-09-28
// java 8
System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

3

ঠিক আছে, যতদূর আমি জানি আপনি এটি কেবলমাত্র জেডিকে ব্যবহার করলে এটি অর্জনের সহজ উপায় নেই।

আপনি অবশ্যই অবশ্যই যুক্তিটি 2 তে কোনও সহায়ক শ্রেণিতে একটি স্থির ফাংশনটিতে রাখতে পারেন, যেমন এখানে টোবেগিনিংএফ-ডে পদ্ধতিতে সম্পন্ন

তারপরে আপনি দ্বিতীয় পদ্ধতিটি এখানে সংক্ষিপ্ত করতে পারেন:

Calendar cal = Calendar.getInstance();
Calendars.toBeginningOfTheDay(cal);
dateWithoutTime = cal.getTime();

অথবা, যদি আপনার এই ফর্ম্যাটটিতে সত্যিকারের বর্তমান সময়ের প্রয়োজন হয় তবে আপনি এটি অন্য স্থিতিশীল সহায়ক পদ্ধতিতে গুটিয়ে রাখতে পারেন, যার ফলে এটি ওয়ান-লাইনার হয়ে যায়।


3

আপনি যদি চান সমস্ত কিছু অন্য কোনও গোলমাল ছাড়াই "YYYY-MM-DD" এর মতো তারিখটি দেখতে হয় যেমন "থু মে 21 12:08:18 ইডিটি 2015" তবে কেবল ব্যবহার করুন java.sql.Date। এই উদাহরণটি বর্তমান তারিখটি পেয়েছে:

new java.sql.Date(System.currentTimeMillis());

এছাড়াও java.sql.Dateএকটি সাবক্লাস হয় java.util.Date


3

সময় ব্যতীত আপনার যদি কেবলমাত্র বর্তমান তারিখের প্রয়োজন হয় তবে অন্য বিকল্পটি হ'ল:

DateTime.now().withTimeAtStartOfDay()

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

3

নীচের মত ব্যবহার করুন LocalDate.now()এবং রূপান্তর করুন Date:

Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());

1
জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি রানটাইমের সময় যে কোনও মুহুর্তে পরিবর্তিত হতে পারে। জেভিএমের মধ্যে যে কোনও অ্যাপের যে কোনও থ্রেডে যে কোনও কোড কল করতে পারে TimeZone.setDefault। আপনার কোডটি ZoneId.systemDefaultদু'বার কল করছে , প্রথমটি অন্তর্নিহিত LocalDate.now()এবং দ্বিতীয়টি স্পষ্ট atStartOfDay। রানটাইমের সময় এই দুটি মুহুর্তের মধ্যে, বর্তমান ডিফল্ট অঞ্চলটি পরিবর্তন করতে পারে। আমি অঞ্চলটি একটি পরিবর্তনশীল হিসাবে ক্যাপচার করার পরামর্শ দিই এবং উভয় পদ্ধতিতে প্রেরণ করব।
বাসিল বাউর্ক

2

আপনার যদি কেবল প্রতিধ্বনি করার উদ্দেশ্যে তারিখের অংশটি প্রয়োজন হয়, তবে

Date d = new Date(); 
String dateWithoutTime = d.toString().substring(0, 10);

1
আমি মনে করি না এটি i18n বন্ধুত্বপূর্ণ
মার্ক লাপাসা

2

এই সম্পর্কে কি?

public static Date formatStrictDate(int year, int month, int dayOfMonth) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, dayOfMonth, 0, 0, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTime();
}

1

পরীক্ষা করে দেখুন Veyder-টাইম । এটি java.util এবং জোদা-সময় উভয়েরই একটি সহজ এবং দক্ষ বিকল্প। এটিতে একটি স্বজ্ঞাত এপিআই এবং ক্লাস রয়েছে যা টাইমস্ট্যাম্প ছাড়াই একা তারিখগুলি উপস্থাপন করে।


1

সর্বাধিক স্ট্রাইগফোরওয়ার্ড যা জাভার বিশাল টাইমজোন ডেটাবেসকে পুরোপুরি ব্যবহার করে এবং এটি সঠিক:

long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);

1

এখানে স্ট্রিং এবং পিছনে কোনও রূপান্তর ছাড়াই একটি পরিষ্কার সমাধান রয়েছে এবং আপনি সময়ের প্রতিটি উপাদান শূন্যে পুনরায় সেট করার সময় এটি বেশ কয়েকবার সময় পুনরায় গণনা করে না। এটিও ব্যবহার করে% দ্বিগুণ ক্রিয়াকলাপ এড়াতে গুণাগুণ দ্বারা ভাগ করার পরিবর্তে (মডুলাস) করে।

এটির জন্য কোনও তৃতীয় পক্ষের নির্ভরতা নেই, এবং এটি ক্যালেন্ডার অবজেক্টের সময়সীমাটি চিহ্নিত করে।

public static Calendar date_only(Calendar datetime) {
    final long LENGTH_OF_DAY = 24*60*60*1000;
    long millis = datetime.getTimeInMillis();
    long offset = datetime.getTimeZone().getOffset(millis);
    millis = millis - ((millis + offset) % LENGTH_OF_DAY);
    datetime.setTimeInMillis(millis);
    return datetime;
}

আমি খুব নিশ্চিত নই যে এটি গ্রীষ্মের tme (DST) কে সম্মান করবে?
ওলে ভিভি

0

তৃতীয় পক্ষের লাইব্রেরি যতটা সম্ভব ব্যবহার না করা পছন্দ করুন। আমি জানি যে এইভাবে আগে উল্লেখ করা হয়েছিল, তবে এখানে একটি দুর্দান্ত পরিষ্কার উপায় রয়েছে:

  /*
    Return values:
    -1:    Date1 < Date2
     0:    Date1 == Date2
     1:    Date1 > Date2

    -2:    Error
*/
public int compareDates(Date date1, Date date2)
{
    SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

    try
    {
        date1 = sdf.parse(sdf.format(date1));
        date2 = sdf.parse(sdf.format(date2));
    }
    catch (ParseException e) {
        e.printStackTrace();
        return -2;
    }

    Calendar cal1 = new GregorianCalendar();
    Calendar cal2 = new GregorianCalendar();

    cal1.setTime(date1);
    cal2.setTime(date2);

    if(cal1.equals(cal2))
    {
        return 0;
    }
    else if(cal1.after(cal2))
    {
        return 1;
    }
    else if(cal1.before(cal2))
    {
        return -1;
    }

    return -2;
}

ভাল, গ্রেগরিয়ানক্যালেন্ডার ব্যবহার না করা সম্ভবত একটি বিকল্প!


0

আমি কেবল এটি আমার অ্যাপ্লিকেশানের জন্য তৈরি করেছি:

public static Date getDatePart(Date dateTime) {
    TimeZone tz = TimeZone.getDefault();
    long rawOffset=tz.getRawOffset();
    long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
    long dt=dateTime.getTime()+rawOffset+dst; // add offseet and dst to dateTime
    long modDt=dt % (60*60*24*1000) ;

    return new Date( dt
                    - modDt // substract the rest of the division by a day in milliseconds
                    - rawOffset // substract the time offset (Paris = GMT +1h for example)
                    - dst // If dayLight, substract hours (Paris = +1h in dayLight)
    );
}

অ্যান্ড্রয়েড এপিআই স্তর 1, কোনও বাহ্যিক লাইব্রেরি নেই। এটি দিবালোক এবং ডিফল্ট সময় অঞ্চলকে সম্মান করে। স্ট্রিংয়ের কোনও হেরফের নেই তাই আমি মনে করি এইভাবে আপনার চেয়ে বেশি সিপিইউ দক্ষ তবে আমি কোনও পরীক্ষা করিনি।


0

আপনি জোদা সময় ব্যবহার করতে পারেন।

private Date dateWitoutTime(Date date){
 return new LocalDate(date).toDate()
}

এবং আপনি সাথে কল:

Date date = new Date();
System.out.println("Without Time = " + dateWitoutTime(date) + "/n  With time = " + date);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.