কিভাবে java.sql.timestamp স্থানীয় তারিখ (জাভা 8) জাভা.টাইমে রূপান্তর করবেন?


127

জাভা 8 কেমন করে আমার রূপান্তর করতে পারেন Timestamp(ইন java.sql) একটি থেকে LocalDate(ইন java.time)?


1
আমার এখানে কিছুটা একই সমস্যা ছিল: stackoverflow.com/a/23197731/1856960 । সংক্ষিপ্ত উত্তর, সত্যিই না। তবে এটি অগত্যা কোনও খারাপ জিনিস নয়।
জ্যাকোভাইফেনেটেড

উত্তর:


196

আপনি করতে পারেন:

timeStamp.toLocalDateTime().toLocalDate();

নোটটি রূপান্তর করতে সময় অঞ্চল timestamp.toLocalDateTime() ব্যবহার করবে Clock.systemDefaultZone()এটি আপনি যা চান তা হতে পারে বা নাও পারে।


1
এটি জাভা ৮-এ যুক্ত করা হয়েছে
অ্যাসিরিয়াস

54
কেবল একটি নোট, timestamp.toLocalDateTime()রূপান্তরটি করতে পদ্ধতিটি সিস্টেম-ডিফল্ট সময় অঞ্চলটি ব্যবহার করবে। এটি আপনি যা চান তা হতে পারে বা নাও পারে।
জ্যাকোভাইফেনেটেড

1
স্পষ্ট সময় অঞ্চল ব্যবহার করে দয়া করে উত্তর পোস্ট করুন ধন্যবাদ!
ব্যবহারকারী 482745

@ জোকোফাইনেটেডের মন্তব্যটি এখানে অত্যন্ত গুরুত্বপূর্ণ, সুতরাং এটির জন্য আপোভোটের সংখ্যা। বিশদের জন্য আমার উত্তর দেখুন stackoverflow.com/a/57101544/2032701
রুসলান

@ জ্যাকোফাইফেনিটেড, LocalDateTimeসর্বদা সিস্টেম-ডিফল্ট টাইমজোন ব্যবহার করে। এর নামে "স্থানীয়" এর অর্থ এটি।
এম

21

গৃহীত উত্তরটি আদর্শ নয়, তাই আমি আমার 2 সেন্ট যুক্ত করার সিদ্ধান্ত নিয়েছি

timeStamp.toLocalDateTime().toLocalDate();

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

ভাল সমাধান হয়

timestamp.toInstant().atZone(zoneId).toLocalDate()

কোথায় zoneId সময় অঞ্চল আপনি যা সাধারণত হয় ব্যবহার করতে চান পারেন ZoneId.systemDefault () আপনার সিস্টেম সময় অঞ্চল বা মত কিছু হার্ডকোডেড সময় অঞ্চল ব্যবহার করতে চান তাহলে ZoneOffset.UTC

সাধারণ পদ্ধতির হওয়া উচিত

  1. নতুন জাভা ৮ তারিখের ক্লাসগুলিতে সরাসরি ব্রেক করুন, যা সরাসরি সম্পর্কিত, যেমন আমাদের ক্ষেত্রে java.Time.Instant java.sql.Timestamp এর সাথে সরাসরি সম্পর্কিত , অর্থাত্ তাদের মধ্যে কোনও টাইমজোন রূপান্তর প্রয়োজন।
  2. সঠিক কাজটি করার জন্য এই জাভা 8 ক্লাসে সু-নকশিত পদ্ধতিগুলি ব্যবহার করুন। আমাদের ক্ষেত্রে এটজোন (জোনআইড) এটি স্পষ্ট করে জানিয়েছে যে আমরা একটি রূপান্তর করছি এবং এর জন্য একটি নির্দিষ্ট সময় অঞ্চল ব্যবহার করছি।

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

5
@ অটোমেটেডমাইক টাইমস্ট্যাম্প (এবং তারিখটি) ইউটিসিতে সময় পয়েন্ট উপস্থাপন করে। লোকাল ডেট সময় সময়ে একটি বিন্দু প্রতিনিধিত্ব করে না, বরং একটি সময় প্রাচীর ঘড়িতে দেখা হিসাবে। দয়া করে তাদের জাভাদোকগুলি পড়ুন। "তাদের মধ্যে রূপান্তরটি কোনও নির্দিষ্ট অঞ্চলে স্বাধীনভাবে করা যেতে পারে" - সত্য নয় , নতুন টাইমস্ট্যাম্প (0L) to আপনার জন্য সময় অঞ্চলটি ফলাফল আলাদা হতে পারে।
রুসলান

1
@ অটোমেটেড মাইক এমনকি আপনি লোকালডেট () ব্যবহার করে সময়টি ছড়িয়ে দিলেও টাইমস্ট্যাম্পটি মধ্যরাতের চারপাশে সময় কাটলে দিনটি ভুল হতে পারে তা প্রমাণ করা সহজ, উদাহরণস্বরূপ নতুন টাইমস্ট্যাম্প (1000 * 60 * 60 * 23) .to লোকালডেটটাইম ()। () ইউটিসিতে যখন "1970-01-01" হয় তখন আমার মস্কোর টাইমজোনটির জন্য "1970-01-02" প্রদান করে।
রুসলান

1
@ অটোমেটেডমাইক "একটি টাইমজোন যুক্ত করে তারপরে আবার তা বন্ধ করে দেয়" - পয়েন্টটি টাইমজোন যুক্ত এবং অপসারণ করছে না, বরং একটি স্পষ্ট টাইমজোন ব্যবহার করে বিভিন্ন ধারণার মধ্যে রূপান্তর করছে । এটি আমার আগের দুটি মন্তব্যের উদাহরণের বিপরীতে যেখানে একটি টাইমজোন নিখুঁতভাবে প্রয়োগ করা হয় ।
রুসলান

7

সময় অঞ্চলটি বিবেচনায় নেওয়ার জন্য আমি @Asslias উত্তরটি সামান্য প্রসারিত করব। নির্দিষ্ট সময় অঞ্চলের জন্য লোকালডেটটাইম পাওয়ার কমপক্ষে দুটি উপায় রয়েছে।

আপনি পুরো অ্যাপ্লিকেশনটির জন্য সেটডফল্ট সময় অঞ্চল ব্যবহার করতে পারেন। যেকোন টাইমস্ট্যাম্প -> জাভা.টাইম রূপান্তর করার আগে এটি কল করা উচিত:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

বা আপনি To ToIstant.atZone চেইন ব্যবহার করতে পারেন:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.