মিলিসেকেন্ডে দীর্ঘ যুগের সময় থেকে আমি কীভাবে একটি জাভা 8 স্থানীয় তারিখ তৈরি করতে পারি?


218

আমার কাছে একটি বাহ্যিক এপিআই রয়েছে যা আমাকে তারিখগুলি ফিরিয়ে দেয় long ইপোকের শুরু থেকেই মিলসেকেন্ড হিসাবে উপস্থাপনের s

পুরানো স্টাইল জাভা এপিআই দিয়ে, আমি Dateএটির সাথে এটির সাথে কেবল একটি নির্মাণ করব

Date myDate = new Date(startDateLong)

জাভা 8 এর LocalDate/ LocalDateTimeক্লাসগুলির সমমান কী ?

আমি আমার বর্তমান স্থানীয় সময় অঞ্চলকে longএকটি দ্বারা প্রতিনিধিত্ব করে সময়কে পয়েন্ট রূপান্তর করতে আগ্রহী LocalDate


6
ভাল আপনি কোন সময় অঞ্চল সম্পর্কে যত্ন নিয়ে কাজ শুরু করতে হবে। "যুগের পর থেকে মিলিসেকেন্ডস" মান আপনাকে সময়মতো তাত্ক্ষণিক দেয় ... যা বিভিন্ন টাইম জোনে বিভিন্ন তারিখের উল্লেখ করতে পারে। মনে রাখবেন যে java.util.Dateকখনই LocalDateসেইভাবে সত্যই তারিখ ছিল না - এটি সময় মতো তাত্ক্ষণিক ছিল।
জন স্কিটি

2
এই প্রশ্নটি দেখুন: স্ট্যাকওভারফ্লো / প্রশ্ন / ২১২৪১২০১০/২ , যা রূপান্তরিত java.util.DateকরেLocalDate
হটস্ট ২৩

2
দ্রষ্টব্য: এই প্রশ্নোত্তর তাদের জন্য File.lastModified()(Epoch মিলিস) রূপান্তর করতে চেষ্টা করছে তাদের পক্ষেও মূল্যবান LocalDate(Time)
কেভিনার্পে

উত্তর:


402

যদি আপনার পর্বের সময়কাল থেকে মিলি সেকেন্ড থাকে এবং বর্তমান স্থানীয় সময় অঞ্চল ব্যবহার করে সেগুলি স্থানীয় তারিখে রূপান্তর করতে চান, আপনি ব্যবহার করতে পারেন

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

তবে মনে রাখবেন যে এমনকি সিস্টেমের ডিফল্ট সময় অঞ্চলও বদলে যেতে পারে long মানটি পরবর্তী মেশিনে এমনকি একই মেশিনেও বিভিন্ন ফলাফল তৈরি করতে পারে।

আরও, মনে রাখবেন যে LocalDate, বিপরীতjava.util.Date সত্যই, তারিখ এবং সময়কে নয়, একটি তারিখের really

অন্যথায়, আপনি একটি ব্যবহার করতে পারেন LocalDateTime:

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());

2
আরও বিস্তারিত ব্যাখ্যা জন্য আমার কাছ থেকে +1। যাইহোক, এমনকি একটি নন-সিস্টেম অঞ্চলও পরিবর্তন করতে পারে (tzupdater-tool বা jdk-change দ্বারা) এবং তাই এর আগে এবং পরে বিভিন্ন ফলাফল তৈরি করতে পারে।
মেনো হচসচাইল্ড

2
@ মেনো হচসচাইল্ড: আমি হার্ডকডযুক্ত সময় অঞ্চলগুলিতে মনোনিবেশ করছিলাম না বরং ব্যবহারকারীর দ্বারা নির্দিষ্ট সময় অঞ্চলগুলির সাথে তুলনা করছিলাম, একটি কনফিগারেশন ফাইল বা পরিবেশের ভেরিয়েবল থেকে পঠিত ছিলাম, যেখানে প্রোগ্রামার স্বাভাবিকভাবেই ধরে নিয়েছিল যে পরিবর্তিত হতে পারে। হার্ডকোডযুক্ত সময় অঞ্চলগুলি আসলে সিস্টেম ডিফল্টের মতো; প্রোগ্রামার ভেবে প্রলোভিত হয় তারা কখনই পরিবর্তন করে না…
হলগার

2
@ ডিমিগোডের LocalDateTime.ofEpochSecond(…)একটি প্রকৃত প্রয়োজন ZoneOffset, তবে ZoneId.systemDefault()একটি প্রদান করে ZoneId। একটি ZoneIdসময় আপনি উল্লেখ করছি বিন্দু উপর নির্ভর করে, বিভিন্ন অফসেট ম্যাপ পারবেন না। যে কি LocalDateTime.ofInstantনির্দিষ্ট রূপান্তর, আপনার জন্য আছে ZoneIdপ্রদত্ত অনুযায়ী Instant
হোলার

2
যুগকে ইউটিসি হিসাবে সংজ্ঞায়িত করা হয় এবং তাই টাইমজোনটি স্বতন্ত্র হওয়া উচিত, তাই অঞ্চলটি সর্বদা ইউটিসি হওয়া উচিত be
PlexQ

2
@ প্ল্লেজকিউ নির্দিষ্ট সময়সীমাটি ইপচের জন্য প্রাসঙ্গিক নয়, যা প্রকৃতপক্ষে টাইমজোন স্বাধীন, তবে ফলাফল LocalDateবা শব্দার্থগুলির জন্য LocalDateTime। আপনি যে কোনও সময় অঞ্চল চান তা নির্দিষ্ট করতে পারবেন, যতক্ষণ না এই ফলাফল অবজেক্টগুলির পরবর্তী ব্যবহারের সাথে সামঞ্জস্য থাকে। আপনি যখন বিভিন্ন পদ্ধতি দ্বারা তৈরি একাধিক বস্তুর সাথে ডিল করেন তখন কী ঘটেছিল তা ভেবে দেখুন। স্থানীয় তারিখ বা তারিখের সময়গুলির জন্য সাধারণ ব্যবহারের ক্ষেত্রে সিস্টেম ডিফল্ট টাইমজোনকে অন্তর্ভুক্ত করে, যেমন LocalDateTime.now()LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
হলগার

37

আপনি ইনস্ট্যান্ট.অফপোচমিলি (দীর্ঘ) দিয়ে শুরু করতে পারেন :

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

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

12

আমি মনে করি আমার আরও ভাল উত্তর আছে।

new Timestamp(longEpochTime).toLocalDateTime();

নতুন টাইমস্ট্যাম্প (ts)। ToLocalDateTime ()। ToLocalDate ()
স্টেপান ইয়াকোভেনকো

5
আমি বলতে চাইছি - জাভাল.এসকিএলএল টাইমস্ট্যাম্প আমদানি করতে আপনার আপত্তি না থাকলে, আমি মনে করি জাভার একক প্রকৃতি দেওয়া ঠিক আছে কারণ এটি জেভিএমের সমস্ত অংশ ... তবে কিছুটা দুর্গন্ধযুক্ত বোধ করে, তবে আমি এখনও এটি আরও ভাল হিসাবে পছন্দ করি এটি স্বীকৃত যুগটি মূলত ইউটিসিতে রয়েছে।
PlexQ

1
Timestampশ্রেণী দুর্বল পরিকল্পিত এবং দীর্ঘ পুরানো হয়েছে। আপনার কোডটি জেভিএমের টাইম জোন সেটিংটি ব্যবহার করবে, তবে যেহেতু এই সেটিংটি আপনার প্রোগ্রামের অন্য কোনও অংশ বা একই জেভিএমে চলমান অন্য কোনও প্রোগ্রাম দ্বারা পরিবর্তন করা যেতে পারে, তাই আমরা এটি নিশ্চিত কি না।
ওলে ভিভি

1
কোন টাইমজোন ব্যবহৃত হয় সে সম্পর্কে স্পষ্ট হওয়া আরও ভাল। পুরাতন java.sql.Timestamp ব্যবহার করে সিস্টেম টাইমজোনকে স্পষ্টভাবে প্রয়োগ করার ফলস্বরূপ রয়েছে যা সাধারণত বিকাশকারীদের মধ্যে বিভ্রান্তি সৃষ্টি করে।
রুসলান

3

সময় অঞ্চল এবং স্টাফ একপাশে রেখে দেওয়া, এর খুব সহজ বিকল্প new Date(startDateLong)হতে পারেLocalDate.ofEpochDay(startDateLong / 86400000L)


6
আমি মনে করি 86400000L এর অর্থ কি আপনার অন্তত তা ব্যাখ্যা করা উচিত।
বেরুস

3
আমি ভেবেছিলাম এটি সহজেই পাওয়া যায় যে এটি একদিনে মিলিসেকেন্ডের সংখ্যা।
মাইকেল পিফেল

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

এছাড়াও নোট করুন যে গৃহীত উত্তরটি সত্যই সেরা উত্তর, এটি কেবল অপ্রতিরোধ্য দেখায়। আমার সহজ হ্যাক শুধু আমার অনেক ক্ষেত্রে যথেষ্ট। এটি দুঃখের বিষয় যা জোদা যেমন করেছিল java.timeতা অন্তর্ভুক্ত নয় DateTimeConstants
মাইকেল পিফেল

2
java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
ভাদজিম

1

আপনার দীর্ঘ মান সহ এখনই .getTime () প্রতিস্থাপন করুন।

//GET UTC time for current date
        Date now= new Date();
        //LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        LocalDate localDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDate();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

-6

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

long startDateLong = <...>

LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();

2
এটি সত্যই জিজ্ঞাসিত প্রশ্নের সাথে খুব বেশি সম্পর্কযুক্ত নয়
কেতন আর

@ কেতনআর, আমি একমত নই প্রশ্নটি "কীভাবে একটি LocalDateথেকে প্রাপ্ত হবে epoch-millis" এবং আমি java.sql.Dateশর্টহ্যান্ডের জন্য কীভাবে ব্যবহার করব তা প্রদর্শন করি । এই পদ্ধতির কোডটিতে ধারণাটি তৈরি হয়েছে যা ইতিমধ্যে কিছু সামর্থ্যে জেডিবিসির সাথে ডিল করছে এবং এটি ঠিক কাজ করে। আপনি যদি এখনও নিশ্চিত না হন তবে এটি প্রাথমিক প্রশ্নের সাথে কীভাবে সম্পর্কিত নয় তা ব্যাখ্যা করুন।
এম

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

@ কেতনআর, যদি কেউ এসকিউএল থেকে দীর্ঘ তারিখ পান তবে আমি তার স্কিমা পরিবর্তন করার পরামর্শ দেব যাতে সে আর এই ধরণের তারিখগুলি না পায়। তবে, কেউ যদি অন্য কোথাও (বাহ্যিক এপিআই) থেকে মিলিস-টাইমস্ট্যাম্প হিসাবে তারিখগুলি গ্রহণ করে এবং তাত্ক্ষণিকভাবে এই তারিখগুলি জেডিবিসির অনুসন্ধানগুলি তৈরি করতে ব্যবহার করে, তবে যোগাযোগটি java.sql.Dateসবচেয়ে সংক্ষিপ্ততম, কোড-ভিত্তিক, এবং আমি বলব যে এটি এতটা কার্যকর নয় Instantসমস্ত মধ্যবর্তী টেম্পোরাল অবজেক্টের সাথে যেতে গেলে শেষ ফলাফলটি একই হয়।
এম

2
আমি ইতিমধ্যে বলেছি এবং আপনার সর্বশেষ ব্যাখ্যা থেকে স্পষ্ট, আপনার উত্তর সঠিক তবে হাতের প্রশ্নের জন্য নয় প্রশ্ন প্রশ্ন: "আমি আমার বর্তমান স্থানীয় সময় অঞ্চলটিতে দীর্ঘকাল একটি স্থানীয় তারিখের প্রতিনিধিত্ব করে বিন্দুটি রূপান্তর করতে আগ্রহী। "আপনার উত্তর বলে:" মিলিস-টাইমস্ট্যাম্প হিসাবে তারিখগুলি গ্রহণ করুন, এবং এই তারিখগুলি তাত্ক্ষণিকভাবে জেডিবিসির অনুসন্ধানগুলি তৈরি করতে ব্যবহার করুন "। আমি বুঝতে পারি না এখানে কি পরিষ্কার নয়?
কেতন আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.