জাভা তারিখ সময় তথ্য বিচ্ছিন্ন


120

আমার কাছে একটি জাভা ডেট অবজেক্ট রয়েছে যাতে তারিখ এবং সময় তথ্য থাকে। আমি এমন একটি পদ্ধতি লিখতে চাই যা সময়ের তথ্যকে সরিয়ে দেয়, ঘন্টা-মিনিট-সেকেন্ডে কাটায়, তাই আমার কাছে কেবল তারিখ বাকি।

উদাহরণ ইনপুট:

2008-01-01 13:15:00

প্রত্যাশিত আউটপুট:

2008-01-01 00:00:00

আপনার কি টিপস আছে? আমি এরকম কিছু করার চেষ্টা করেছি:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

তবে আমি সময় অঞ্চলটি নিয়ে সমস্যায় পড়েছি।

উত্তর:


178

সুপারিশ করা তারিখ / সময় ম্যানিপুলেশন করতে উপায় ব্যবহার করা Calendarবস্তু:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();

2
@ ক্লেটাস, ডেট অবজেক্ট থেকে সময় সরিয়ে নেওয়া কি সম্ভব? আমি 2008-01-01 এর মতো খাঁটি তারিখের কোনও সময় অংশ চাই না।
প্রেম

2
আমি java.util বলতে পারি না।ক্যালেন্ডার প্রস্তাবিত। সান / ওরাকল জাভা 8-এ সেই নতুন ক্লাসটি নতুন জাভা.টাইম প্যাকেজের সাহায্যে সরবরাহ করেছিলেন। যে বা জোদা-সময় ব্যবহার করুন।
বেসিল বাউরক

3
ক্যালেন্ডার আর সুপারিশ করা হয় না। দেখুন stackoverflow.com/a/28868089/40064 যদি আপনি জাভা 8. ব্যবহার করছেন
Wim Deblauwe

2
এফওয়াইআই, জাভা.টাইম ক্লাসগুলির দ্বারা দমনকৃত পুরানো ডেট-টাইম ক্লাসগুলি যেমন java.util.Calendarএখন লিগ্যাসিওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বেসিল Bourque

147

আপনি কি অ্যাপাচি কমন্স ল্যাং- এ ডেট ইউটিলস ট্র্যাঙ্কেট পদ্ধতিটি দেখেছেন ?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

সময় উপাদান সরিয়ে ফেলবে।


9
আবার আপডেট হওয়া লিংকটি (অ্যাপাচে আসুন! আপনার ডক্সের চারপাশে প্রস্থান করুন!)
ওগ্রে গীতসংহিতা 33

6
এই ট্রান্সকেট ক্রিয়াকলাপটি যে টাইমজোনটি করা হয় তার সর্বদা স্থানীয় পিসি টাইমজোন Min সুতরাং আপনি যদি ইউটিসি টাইমজোন বা স্থানীয় টাইমজোন ব্যতীত অন্য কোনও টাইমজোনগুলিতে ক্যালেন্ডার এবং তারিখগুলি নিয়ে কাজ করে থাকেন - তবে এটি তারিখটি কাটাতে পারে intended
মেঘ

ক্লাউড যেমন উল্লেখ করেছেন যে, আমি এখানে ক্যালেন্ডার উদাহরণ দেখতে পাচ্ছি না (এটির উপরে কোনও নিয়ন্ত্রণ নেই) আমাকে কিছুটা ঘাবড়ে যায় :)
জারোস্লাভ জারুবা

এই পদ্ধতিটি আশ্চর্যজনকভাবে দীর্ঘ এবং এতে কমপক্ষে দুটি বাগফিক্স রয়েছে।
পিনো

42

আপনি জোদার দিকে তাকিয়েছেন ? তারিখ এবং সময় নিয়ে কাজ করার এটি একটি অনেক সহজ এবং আরও স্বজ্ঞাত উপায়। উদাহরণস্বরূপ আপনি লোকালডেটটাইম এবং লোকালডেট অবজেক্টের মধ্যে তুচ্ছভাবে রূপান্তর করতে পারেন ।

উদাহরণস্বরূপ (এপিআই বর্ণনা করার জন্য)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

অতিরিক্তভাবে এটি তারিখ / সময় বিন্যাসগুলি সহ কিছু থ্রেড-সুরক্ষা সমস্যাগুলি সমাধান করে এবং জাভাতে কোনও তারিখ / সময় সমস্যা নিয়ে কাজ করার জন্য দৃ strongly়ভাবে সুপারিশ করা উচিত।


12
আমি বিশ্বাস করি। ভাঙা জাভা.ইটিল ক্লাসগুলির সাথে লড়াইয়ের চেয়ে আরও ভাল গ্রন্থাগার ব্যবহার করার পরামর্শ দেওয়া (প্রশ্নের প্রমাণ হিসাবে)
ব্রায়ান অগ্নিউ

10
অবশ্যই এটি সম্পর্কিত, জাডা জাভাতে তারিখ, সময় এবং ক্যালেন্ডার হেরফেরের জন্য লাইব্রেরি। এটির সুপারিশ না করা দায়বদ্ধতা হ'ল।
জোয়েল

1
থ্রেড সুরক্ষা ইস্যুটি খুব আকর্ষণীয়, আমি এই পোস্টটিতে একটি ওরাকল / হাইবারনেট ত্রুটি "IllegalArgumentException, sun.util.cender.ZoneInfo.getOffset (ZoneInfo), oracle.jdbc.driver.DateCommonBinder.zoneOffset (OraclePrepare)" নিয়ে গবেষণা করে এই পোস্টটি পেয়েছি। এটি আরেকটি ওরাকল সমস্যা সম্পর্কিত কথা বলে যা কেবলমাত্র ডাব্লু ভারী লোড forums.oracle.com/forums/thread.jspa?threadID=325576 দেখা যায় এমনকি স্বাভাবিক কোডে অবৈধ মিলিসেকেন্ড সহ একটি অবজেক্ট তৈরি করা সত্যই শক্ত। আমার জন্য, আমি মনে করি যে আমি জোদা ব্যবহার করে আমার থ্রেডে হতাশাবৃত হব, তার চেয়ে ওরাকলকে সম্ভবত সন্দেহযুক্ত-জোদা স্টাফ ব্যবহার করতে দেওয়া হবে।
মার্ক বনেট

4
আমি আশা করি আমি যারা ভোট দিয়েছি তাদের প্রত্যেককেই আমি নীচে নামতে পারতাম। এই সমস্ত লোক কারা যারা এমন একটি উত্তর +1 করে যা এমনকি প্রশ্নের উত্তর দেওয়ার চেষ্টা করে না? জোদা ব্যবহার করে একটি উত্তর স্বাগত চেয়ে বেশি হতে পারে, কিন্তু এটি না ...
রায়ান

1
@ রায়ান এই উত্তরটি কীভাবে প্রাসঙ্গিক নয়? প্রশ্নটি দিনের কোনও সময় ছাড়াই তারিখ চেয়েছিল। এই উত্তরটি এমন একটি শ্রেণীর উপস্থাপন করে যার একমাত্র উদ্দেশ্য একটি সময়কালীন সময় ছাড়া একটি তারিখকে প্রতিনিধিত্ব করে।
তুলসী বাউরক

35

জাভা.টাইম ক্লাসগুলির আলোতে এখন একটি দ্রুত আপডেট এখন জাভা 8 এবং তার পরে তৈরি করা হয়েছে।

LocalDateTimeএমন একটি truncatedToপদ্ধতি রয়েছে যা আপনি এখানে যা বলছেন তা কার্যকরভাবে সম্বোধন করে:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

এটি বর্তমান সময়টিকে কেবল কয়েক মিনিটের মধ্যে প্রকাশ করবে:

2015-03-05T11:47

আপনি কাটা কাটা চালাতে DAYS এর চেয়ে ছোট ChronoUnit(বা ক TemporalUnit) ব্যবহার করতে পারেন (যেহেতু কাটাটি শুধুমাত্র লোকালডেটটাইমের সময় অংশে প্রয়োগ করা হয়, তারিখের অংশে নয়)।


3
আপনি কেবল DAYS অবধি ক্রোনোইনাইট ব্যবহার করতে পারেন - উচ্চতর ইউনিটগুলি ব্যতিক্রম ছুঁড়ে ফেলবে।
Assylias


22

জোদার সাথে আপনি সহজেই প্রত্যাশিত তারিখটি পেতে পারেন।

সংস্করণ ২.7 অনুসারে (সম্ভবত পূর্ববর্তী সংস্করণটি ২.২-এর চেয়ে বেশি কিছু হতে পারে), একজন মন্তব্যকারী নোট হিসাবে , সুবিধার্থে toDateMidnightঅবহিত করা হয়েছে বা যথাযথভাবে নামকরণ করা হয়েছে withTimeAtStartOfDay(), সুবিধাজনক করে তুলেছে

DateTime.now().withTimeAtStartOfDay()

সম্ভব.

এক উপায়ে উত্তম এপিআই যুক্ত করে বেনিফিট।

পুরানো সংস্করণ সহ, আপনি এটি করতে পারেন

new DateTime(new Date()).toDateMidnight().toDate()

6
জোদা-সময়ের মধ্যরাত সম্পর্কিত পদ্ধতি এবং ক্লাসগুলি এখন হ্রাস করা হয়েছে। বিকাশকারীরা সেগুলি ব্যবহারের বিরুদ্ধে প্রস্তাব দেয়। পরিবর্তে পদ্ধতিটি ব্যবহার করুন withTimeAtStartOfDay
তুলসী বাউরক

নির্দেশ করার জন্য আপনাকে ধন্যবাদ। এটি বিবেচনা করার জন্য উত্তর আপডেট করেছেন।
h7r

আপনি toLocalDateএমন কোনও অবজেক্ট পেতেও ব্যবহার করতে পারেন যার একটি সময় উপাদানও নেই।
চার্লস উড

এফওয়াইআই, জোদা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে , দলটি জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশনের পরামর্শ দিচ্ছেওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বাসিল বাউর্ক

8

আমি নতুন জাভা 8 এপিআই দিয়ে কাটা কাটা করেছি। আমি একটি অদ্ভুত জিনিসের মুখোমুখি হয়েছিলাম তবে সাধারণভাবে এটি ছাঁটাই ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);

কীওয়ার্ডস: জাভা.টাইম, জাভা 8, লোকালডেটটাইম.আর্টংক্যাটেডটো ()
আলেকজান্ডার টেলর

1
এই উত্তরটি কেবলমাত্র ইউটিসির সময় অঞ্চলের প্রসঙ্গের জন্য তারিখ তৈরি করে।
বাসিল বাউরক

6

এইভাবে কাটা কাটা সংকেত সহ অ্যাপাচি থেকে তারিখ ব্যবহার করুন:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);

এটি স্থানীয় টাইম জোনে ছাঁটাই হবে, ইউটিসি-তে নয় যে তারিখটি (গেটটাইম) প্রতিনিধিত্ব করে।
ইপোক্স

6

টাইমস্ট্যাম্পগুলির জন্য:

timestamp -= timestamp % (24 * 60 * 60 * 1000)

3
এই কোডটিতে একটি ক্ষুদ্র ত্রুটি রয়েছে - বাম বন্ধনীটি সঠিকভাবে স্থাপন করা হয়নি, এটি টাইমস্ট্যাম্প - = টাইমস্ট্যাম্প% (24 * 60 * 60 * 1000) হতে হবে। এটি সময়ের অংশটি কেটে দেবে। এবং আমি নিশ্চিত যে এই পথে ক্যালেদার অবজেক্ট তৈরি করা এবং এর পদ্ধতিগুলি নিয়ে বা এমনকি অন্য কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার চেয়ে যথেষ্ট যথেষ্ট
স্ট্যান

2
না, এটি সঠিক সমাধান নয়, সতর্কতা অবলম্বন করুন। এটি মেঝেতে তারিখের মানকে গোল করার মতোই, এটি - আপনি 29 মার্চ টাইমস্ট্যাম্পের জন্য 28 মার্চ পেতে পারেন (আপনার লোকালে)। সুতরাং ক্যালেন্ডার ভিত্তিক সমাধান (এ্যাপাচি এর DateUtils ক্যালেন্ডার, খুব ব্যবহার করে) একমাত্র উপায়
ড্রিউ

দিবালোক সংরক্ষণের কারণে সময় পরিবর্তন হলে এটিও কাজ করবে না।
আলেকজান্দ্রু সেভেরিন

5

Java.util.Date জাভাডক্স থেকে:

ক্লাসের তারিখটি মিলিসেকেন্ড যথার্থতার সাথে সময়ে একটি নির্দিষ্ট তাত্ক্ষণিকতার প্রতিনিধিত্ব করে

এবং java.sql. তারিখ জাভাডক্স থেকে:

এসকিউএল তারিখের সংজ্ঞা মেনে চলার জন্য, জাভা.এসকিএল.এর উদাহরণ দ্বারা মোড়ানো মিলিসেকেন্ড মানগুলি নির্দিষ্ট সময় অঞ্চলে ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ডকে শূন্যের সাথে সেট করে 'স্বাভাবিককরণ' করতে হবে যার সাথে উদাহরণটি যুক্ত রয়েছে ।

সুতরাং, আপনি সময় অংশের প্রয়োজন না হলে java.sql. তারিখটি ব্যবহার করা সবচেয়ে ভাল উপায়

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

এবং আউটপুটটি হ'ল:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26

4

TL; ড

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00: 00 +01: 00 [ইউরোপ / প্যারিস]

আপনার পছন্দসই বিন্যাসে একটি স্ট্রিং তৈরি করতে, একটি পাস করুন DateTimeFormatter

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

বিস্তারিত

অন্যান্য উত্তরগুলি সঠিক, তবে এখন জাভা.টাইম ফ্রেমওয়ার্কের সাহায্যে পুরানো তারিখ-কালীন ক্লাসগুলি ব্যবহার করুন।

java.time

জাভা.টাইম ফ্রেমওয়ার্কটি জাভা 8 এবং তার পরে তৈরি করা হয়েছে। জাভা.টাইম কার্যকারিতাটির বেশিরভাগটি জাভা 6 এবং 7 ( থ্রিটেন-ব্যাকপোর্ট ) এ পুনরায় পোর্ট করা হয় এবং আরও অ্যান্ড্রয়েডে ( থ্রিটেনএবিপি ) অভিযোজিত ।

আইএসও 8601 ফর্ম্যাটের ক্যানোনিকাল সংস্করণ মেনে চলার জন্য প্রথমে ইনপুট স্ট্রিংটি পরিবর্তন করুন। মানক আইএসও 8601 ফর্ম্যাটগুলি জাভা.টাইম ক্লাসে ডিফল্টরূপে তারিখের সময়ের মানগুলিকে উপস্থাপনকারী স্ট্রিংগুলি পার্সিং / উত্পন্ন করার জন্য ব্যবহৃত হয়। আমাদের মাঝে সেই স্পেসটি মাঝখানে প্রতিস্থাপন করতে হবে T

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

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

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString ()… 2008-01-01T13: 15: 00

আপনি যদি দিনের সময় বা সময় অঞ্চল সম্পর্কে চিন্তা না করেন তবে একটিতে রূপান্তর করুন LocalDate

LocalDate ld = ldt.toLocalDate();

ld.toString ()… 2008-01-01

দিনের প্রথম মুহুর্ত

পরিবর্তে যদি আপনি দিনের প্রথম মুহুর্তে দিনের সময়সীমা সেট করতে চান, একটি ZonedDateTimeশ্রেণি ব্যবহার করুন , তারপরে LocalDateতার atStartOfDayপদ্ধতিটি কল করতে কোনও বস্তুতে রূপান্তর করুন । সচেতন থাকুন যে প্রথম মুহুর্তটি 00:00:00দিবালোক সেভিং সময় বা সম্ভবত অন্যান্য অসঙ্গতির কারণে সময় নাও হতে পারে ।

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

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [আমেরিকা / মন্ট্রিল]

ইউটিসি

ইউটিসি টাইম জোনের লেন্সের মধ্য দিয়ে সেই মুহূর্তটি দেখতে কোনও Instantবস্তুটি বের করুন । উভয়ই ZonedDateTimeএবং Instantসময়রেখায় একই মুহুর্তের প্রতিনিধিত্ব করবে তবে দুটি পৃথক প্রাচীর-ঘড়ির সময় হিসাবে প্রদর্শিত হবে ।

একটি Instantজাভা.টাইমে সর্বদা সংজ্ঞা অনুসারে ইউটিসিতে বেসিক বিল্ডিং-ব্লক ক্লাস। এই ক্লাসটি ঘন ঘন ব্যবহার করুন, আপনার সাধারণভাবে আপনার ব্যবসায়িক যুক্তি, ডাটা স্টোরেজ এবং ইউটিসিতে ডেটা এক্সচেঞ্জ করা উচিত।

Instant instant = zdtStartOfDay.toInstant();

instant.toString ()… 2008-01-01T05: 00: 00Z

আমরা মধ্যরাতের স্ট্রোক-অফের চেয়ে 5 টা দেখি। স্ট্যান্ডার্ড ফর্ম্যাটে, প্রান্তটি Zসংক্ষিপ্ত Zuluএবং এর অর্থ "ইউটিসি"।


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

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

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

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

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*

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

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



2

প্রশ্নটি পরস্পরবিরোধী। এটি দিনের একটি সময় ছাড়া একটি তারিখ চায় তবে এখনও সময়ের সাথে একটি উদাহরণ প্রদর্শন করে 00:00:00

Joda-টাইম

আপডেট: Joda-টাইম প্রকল্পে এখন রক্ষণাবেক্ষণ মোড , দলের কাছে মাইগ্রেশন পরামর্শ দিয়ে java.time ক্লাস। জাভা.টাইম সমাধানের জন্য আমার অন্যান্য উত্তর দেখুন ।

পরিবর্তে যদি আপনি দিনের প্রথম মুহুর্তে দিনের সময়সীমা সেট করতে চান DateTimeতবে জোদা-টাইম লাইব্রেরিতে একটি অবজেক্ট ব্যবহার করুন এবং এর withTimeAtStartOfDayপদ্ধতিটি কল করুন । সচেতন থাকুন যে প্রথম মুহুর্তটি 00:00:00দিবালোক সেভিং সময় বা সম্ভবত অন্যান্য অসঙ্গতির কারণে সময় নাও হতে পারে ।


এটিই সুনির্দিষ্ট উত্তর (ধরে নিচ্ছেন যে কেউ জোদা সময় ব্যবহার করতে পারে এবং করতে চায়)
ক্লিন্ট ইস্টউড

2

শুধু clear()অপ্রয়োজনীয় ক্ষেত্র

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

জাভা 8 থেকে আরও ভাল বিকল্পের truncatedToপদ্ধতিটি ব্যবহার করা LocalDateTimeযেমন:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)

এটি কাজ করে না, কারণ calendar.clear(Calendar.HOUR_OF_DAY);ঘন্টা সাফ করে না। @ ক্লেটাসের সমাধানটি ঠিক আছে।
আরকাও

দুঃখিত, আপনি ঠিক বলেছেন, আমি এটি সংশোধন করেছি, কয়েক ঘন্টা আপনার মান নির্ধারণ করা উচিত। সাধারণভাবে এটি কীভাবে তারিখটি
কাটাবেন

1

এটি আমাকে সত্যিই বিরক্ত করেছিল যে নতুন "উন্নত" ক্যালেন্ডার নির্মাতা "ভয়ঙ্কর" পুরানো তারিখের মতো মিলি সেকেন্ডের জন্য কোনও int নেন না। আমি তখন সত্যিই ক্রস পেয়েছিলাম এবং এটি লিখেছিলাম:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

আমি তখন "স্টাফ" শব্দটি ব্যবহার করি নি, তবে আমি এর সুখটি আবিষ্কার করেছি:

startTime.set(Calendar.MILLISECOND, 0);

তবে আমি এখনও এটি সম্পর্কে যথেষ্ট ক্রস।


1

আমি ইস্যুটি এটির মতো ঠিক করেছি (পূর্ব আট জোন (বেইজিংয়ের সময়)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

সবার আগে, আপনার স্পষ্ট হওয়া উচিত টাইম স্ট্যাম্প কী। টাইম স্ট্যাম্প GMT (ইউটিসি হিসাবে একই) এর জানুয়ারী 01 00:00:00 1970, বা থু জানুয়ারী 01 08:00:00 সিএসটি 1970 থেকে এখন পর্যন্ত মোট মিলিসেকেন্ড।

মনে রাখবেন: টাইম স্ট্যাম্প সময় অঞ্চল থেকে স্বতন্ত্র।

সুতরাং আপনি পৃথক সময় অঞ্চলে নিম্নলিখিত বিবৃতিতে একই ফলাফল পাবেন:

System.out.println(new Date().getTime());

এবং

System.out.println(new Date(0));

বিভিন্ন টাইম জোনে ডিফেরেন্ট সময় তথ্য মুদ্রণ করে: আপনি যদি আপনার পিসি সময় অঞ্চলটিকে ইউটিসি হিসাবে সেট করেন তবে আপনি পাবেন

Thu Jan 01 00:00:00 UTC 1970

তবে আপনি সময় অঞ্চলটি (ইউটিসি +8: 00) বেইজিং, চংকিং, হংকং, উরুমক হিসাবে নির্ধারণ করলে আপনি পাবেন:

Thu Jan 01 08:00:00 CST 1970

জাভা টাইম স্ট্যাম্প পেয়েছে, তারপরে টাইম জোন অনুসারে তারিখ এবং সময় তথ্য প্রদর্শন করে।

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

পূর্ব আট জোন (বেইজিং সময়) এর মতো, বেইজিংয়ের সময় GMT এর চেয়ে 8 ঘন্টা আগে, সুতরাং আপনি যখন মডুলো অপারেশন করেন তখন আপনার আরও 8 ঘন্টা বিয়োগ করা উচিত। এটি বলার জন্য, আপনার প্রথমে GMT সময় পাওয়া উচিত, তখন আপনার পিসির সময় অঞ্চল সেটিংয়ের উপর ভিত্তি করে প্রদর্শনের সময় জাভা 8 ঘন্টা যোগ করবে।


সময় অঞ্চল ইস্যুটি অস্পষ্ট এবং দীর্ঘ সময় ধরে আমাকে ধাঁধা দেয়। এখন আমি এটি পরিষ্কার করে দিচ্ছি। আশা সাহায্য করে।


2018-01-04 নীচের পদ্ধতিটিও কাজ করে।

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}


এফওয়াইআই, এই উত্তরটিতে জাভা.টাইম ক্লাসগুলি দ্বারা বহু বছর পূর্বে উদ্ভূত সমস্যাযুক্ত পুরানো তারিখের সময় ক্লাসগুলি ব্যবহার করা হয়েছে ।
বাসিল বাউর্কে

1

টাইমজোন সমস্যা এড়াতে আপনি এটি করতে পারেন:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

যদিও জাভা Dateঅবজেক্টটি টাইমস্ট্যাম্প মান, তবে ছাঁটাইয়ের সময়, এটি স্থানীয় সময় অঞ্চলে রূপান্তরিত হবে, সুতরাং আপনি ইউটিসি টাইমজোন থেকে মান আশা করলে অবাক করা মান পাবেন।


কয়েক বছর আগে জাভা.টাইম ক্লাসগুলি জাভা 8 এবং তার পরে জেএসআর 310 প্রয়োগ করে সমস্যা CalendarDateক্লাসগুলি উত্তরাধিকারে পরিণত হয়েছিল। 2018 এ তাদের ব্যবহারের পরামর্শ দেওয়া হ'ল দুর্বল পরামর্শ।
বাসিল বাউর্কে

0

দেরিতে প্রতিক্রিয়া হতে পারে তবে এখানে কোনও লাইব্রেরি ব্যবহার না করে এক লাইনে এটি করার একটি উপায়:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))

0

সংস্করণ ২.০ থেকে জোদা-সময় সহ আপনি ব্যবহার করতে পারেন LocalDate.toDate()

কেবল

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();

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

অপ্রয়োজনীয় হতে পারে তবে আমি এখানে একটি সরল উদাহরণ রেখেছি কারণ আমি স্বীকার করেছি যে উত্তরটি মন্তব্য করা উচিত নয়। হ্যাঁ, java.util. তারিখ টাইমজোনকে উপেক্ষা করে তবে মূল প্রশ্নটি ছিল a Java Date objectতাই আমি ব্যবহার করেছি java.util.Date। তবুও এটি ব্যাখ্যা করে না যে তার টাইমজোনটি java.util.Date (কখন? কোথায়?) নিয়ে সমস্যাযুক্ত যদিও তিনি অন্যটি ব্যবহার করতে সহায়তা করতে পারেন না Date
লামুসিক

0

ক্যালেন্ডার ব্যবহার করে সমস্ত উত্তরের জন্য আপনার পরিবর্তে এটি ব্যবহার করা উচিত

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

তবে আমি এটি পছন্দ করি:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}

java.sql.Dateবর্গ একটি তারিখ কেবল-মান প্রতিনিধিত্ব ভান কিন্তু আসলে একটা সময় অফ দিন ইউটিসি সময় অঞ্চল জন্য স্থায়ী আছে। সুতরাং আসলেই প্রশ্নের উপযুক্ত সমাধান নয়।
বাসিল বাউরক

0

আপনি যদি জাভা 8+ ব্যবহার করেন তবে সময় ব্যতীত তারিখ পাওয়ার জন্য এখানে একটি সহজ উপায়: তারিখের পরিবর্তে java.time.LocalDate টাইপ ব্যবহার করুন ।

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

আউটপুট:

2019-05-30

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html


1
LocalDateবেশিরভাগ উদ্দেশ্যে ব্যবহার করা ভাল ধারণা, তবে এটি কীভাবে প্রশ্ন থেকে ইনপুট নিয়ে কাজ করবে তা অস্পষ্ট 2008-01-01 13:15:00
ওলে ভিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.