জাভাতে লং টু ডেট রূপান্তর করা 1970 সালে ফিরে আসে


118

আমার কাছে দীর্ঘ মূল্য সহ তালিকা রয়েছে (উদাহরণস্বরূপ: 1220227200, 1220832000, 1221436800 ...) যা আমি ওয়েব পরিষেবা থেকে ডাউনলোড করেছি। আমি অবশ্যই এটি তারিখগুলিতে রূপান্তর করব। দুর্ভাগ্যক্রমে এইভাবে, উদাহরণস্বরূপ:

Date d = new Date(1220227200);

1970 সালের 1 জানুয়ারী ফিরিয়ে দেয় Anyone যে কেউ এটিকে সঠিকভাবে রূপান্তর করতে অন্য কোনও উপায় জানেন?


আপনি কি মূল্যবোধ আশা করতে পারেন? সেকেন্ড / মিলিসেকেন্ডের প্রশ্নটি বৈধ হতে পারে তবে 1220227200 1/1/1970 নয়। দেখে মনে হচ্ছে আপনি 0 টি নির্মাণকারীর কাছে যাচ্ছেন। আরও কিছু কোড সাহায্য করতে পারে।
এসজুয়ান 76

1
@ ম্মমিকি - আপনার উত্তরটি গ্রহণ করা উচিত
স্টুয়ার্ট

এটি জানুয়ারী 15 ম এখানে, এখানে প্রথম জন নয়।
njzk2

অবগতির জন্য, যেমন ভয়ঙ্কর ত্রুটিপূর্ণ তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 এবং পরে পাতাটা ক্লাস।
তুলসী বাউরকে

উত্তর:


161

Dateকন্সট্রাকটর (লিঙ্ক ক্লিক করুন!) হিসেবে সময় গ্রহণ করে longমিলিসেকেন্ড , না সেকেন্ড। আপনাকে এটির 1000 দিয়ে গুণ করতে হবে এবং নিশ্চিত করে নিন যে আপনি এটি সরবরাহ করেছেন long

Date d = new Date(1220227200L * 1000);

এটি এখানে দেখায়

রবিবার আগস্ট 31 20:00:00 GMT-04: 00 2008


22
বা বিকল্পভাবে, Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));একটি ক্লিনার এবং কম যাদু-সংখ্যাযুক্ত সমাধানের জন্য ব্যবহার করুন।
প্রিয়দু নিমরে

56

TL; ড

java.time.Instant                    // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L )     // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.

আপনার ডেটা জানুন

প্রথম যুগের পর থেকে লোকেরা ট্র্যাকিংয়ের সময় বিভিন্ন স্পষ্টতা ব্যবহার করে । সুতরাং আপনি যখন প্রথম যুগের পরে একটি গণনা হিসাবে ব্যাখ্যা করার জন্য কিছু নম্বর পান তবে আপনাকে অবশ্যই নির্ধারণ করতে হবে:

  • কোন যুগ?
    বহু যুগের খেজুর বিভিন্ন সিস্টেমে ব্যবহৃত হয়েছে। সাধারণত ব্যবহৃত হয় পসিক্স / ইউনিক্স সময় , যেখানে ইউটিসি-তে 1970 এর প্রথম মুহূর্ত is তবে আপনার এই যুগটি গ্রহণ করা উচিত নয় ।
  • কি নির্ভুলতা? যুগে যুগে
    আমরা কি সেকেন্ড, মিলিসেকেন্ড , মাইক্রোসেকেন্ডস বা ন্যানোসেকেন্ডগুলিতে কথা বলছি ?
  • কি সময় অঞ্চল?
    যুগের পর থেকে সাধারণত একটি গণনা ইউটিসি / জিএমটি টাইম জোনে থাকে, অর্থাত্ কোনও টাইম জোন অফসেট হয় না। কিন্তু কখনও কখনও, অনভিজ্ঞ বা তারিখ-সময় অজ্ঞ প্রোগ্রামারদের জড়িত করার সময়, একটি অন্তর্নিহিত সময় অঞ্চল থাকতে পারে।

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

পাঠ শিখেছি:

  • প্রাপ্ত তথ্যগুলির অর্থ নির্ধারণ করুন, ধরে নিবেন না।
  • ডক পড়ুন ।

পুরো সেকেন্ড, মিলিসেকেন্ডস, মাইক্রোসেকেন্ডস এবং ন্যানোসেকেন্ড সহ ডেট-টাইম সিস্টেমে রেজোলিউশনের বিভিন্ন গ্রানুলিটিস দেখাচ্ছে গ্রাফ।

আপনার তথ্য

আপনার ডেটা পুরো সেকেন্ডে মনে হচ্ছে। যদি আমরা 1970 এর শুরুতে একটি যুগকে ধরে নিই এবং আমরা যদি ইউটিসি সময় অঞ্চলটি ধরে নিই, তবে 1,220,227,200সেপ্টেম্বর 2008 এর প্রথম দিনের প্রথম মুহূর্ত is

Joda-টাইম

জাভা.ইটিল.ডেট এবং .ক্যালেন্ডার ক্লাস জাভায় বান্ডিল করা কুখ্যাত সমস্যাযুক্ত। এগুলি এড়িয়ে চলুন। পরিবর্তে জোদা-টাইম লাইব্রেরি বা জাভা 8-এ বান্ডিল করা নতুন জাভা.টাইম প্যাকেজটি ব্যবহার করুন (এবং জোদা-সময় দ্বারা অনুপ্রাণিত)।

নোট করুন যে জুনডেটের বিপরীতে, DateTimeজোদা-টাইমের একজন সত্যিকার অর্থে তার নিজের নির্ধারিত সময় অঞ্চলটি জানেন । সুতরাং নীচে প্রদর্শিত জোডা-টাইম ২.৪ কোডের উদাহরণে নোট করুন যে আমরা প্রথমে ইউটিসির ডিফল্ট অনুমানটি ব্যবহার করে মিলিসেকেন্ডগুলি পার্স করি। তারপরে, দ্বিতীয়ত, আমরা প্যারিসের একটি সময় অঞ্চল সামঞ্জস্য করে assign মহাবিশ্বের টাইমলাইনে একই মুহূর্ত, তবে বিভিন্ন প্রাচীর-ঘড়ির সময় । প্রদর্শনের জন্য, আমরা আবার ইউটিসিতে সমন্বয় করি। অন্তর্নিহিত ডিফল্ট (প্রায়ই তারিখের সময়কালে সমস্যার কারণ) এর উপর নির্ভর করার পরিবর্তে আপনার কাঙ্ক্ষিত / প্রত্যাশিত সময় অঞ্চলটি স্পষ্ট করে নির্দিষ্ট করা ভাল better

ডেটটাইমটি তৈরি করতে আমাদের মিলিসেকেন্ডগুলি দরকার। সুতরাং আপনার সেকেন্ডের ইনপুট নিন এবং এক হাজার দিয়ে গুণ করুন। মনে রাখবেন যে ফলাফলটি অবশ্যই একটি -৪-বিট হতে হবে longকারণ আমরা ৩২-বিটকে উপচে ফেলেছি int

long input = 1_220_227_200L;  // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".

নির্মাতাকে মিলিসেকেন্ডের গণনাটি খাওয়ান। সেই নির্দিষ্ট নির্মাতা ধরে নিলেন গণনাটি ১৯ 1970০ সালের ইউনিক্সের যুগের।

যথাযথ টাইম জোনের নাম, মহাদেশ এবং শহর / অঞ্চলের সংমিশ্রণ ব্যবহার করুন । কখনও কখনও 3 বা 4 বর্ণ কোড ব্যবহার করবেন ESTনা কারণ এগুলি অনন্য নয় মানকযুক্ত।

DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );

প্রদর্শনের জন্য, আবার সময় অঞ্চলটি সামঞ্জস্য করুন।

DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );

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

System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );

যখন রান।

dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00

java.time

জোডা-টাইম এর নির্মাতারা আমাদের প্রতিস্থাপনে স্থানান্তর করতে বলেছেন, জাভা.টাইম কাঠামো যত তাড়াতাড়ি সম্ভব সুবিধাজনক is জোদা-টাইম সক্রিয়ভাবে সমর্থিত অব্যাহত থাকলেও, ভবিষ্যতের সমস্ত বিকাশ জাভা.টাইম ক্লাস এবং থ্রিটেন-অতিরিক্ত প্রকল্পে তাদের সম্প্রসারণে করা হবে।

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

একটি Instantমধ্যে টাইমলাইনে একটি মুহূর্ত ইউটিসি ন্যানোসেকেন্ড একটি রেজোলিউশনে। এটি ইউটিসিতে 1970 এর প্রথম মুহূর্ত moment

Instant instant = Instant.ofEpochSecond( 1_220_227_200L );

একটি আবেদন অফসেট-থেকে-ইউটিসি ZoneOffset একটি পেতে OffsetDateTime

এখনো ভালো, যদি জানা থাকে, একটি সময় জোন প্রয়োগ ZoneIdএকটি পেতে ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

আধুনিক ও উত্তরাধিকার উভয় ক্ষেত্রে জাভাতে সমস্ত তারিখ-সময়ের ধরণের সারণী


1
চিয়ারস বন্ধু। দুর্দান্ত ব্যাখ্যা। আমি ১৯ 1970০ সাল থেকে নতুন ডেটটাইম (<দীর্ঘ সংখ্যা>) পাচ্ছিলাম যখন আমি বুঝতে পারি যে আমি এটি সেকেন্ডের মধ্যে দিচ্ছি এবং মিলি সেকেন্ডে প্রয়োজনীয়
সুয়াশ দীক্ষিত

40

দেখে মনে হচ্ছে আপনার দীর্ঘতমগুলি সেকেন্ড, এবং মিলিসেকেন্ড নয়। তারিখ নির্মাতা মিলিস হিসাবে সময় নেয়, তাই

Date d = new Date(timeInSeconds * 1000);

4
@ f1sh: আমি ডাউনওয়েট করিনি, তবে আসল উত্তরটি আলাদা ছিল। তিনি 5 মিনিটের অনুগ্রহের মধ্যে এটি সম্পাদনা করেছিলেন।
BalusC

স্পষ্টতার জন্য ধন্যবাদ। এটি হ'ল নিজস্বভাবে ডাউনসাইড এসও ...: - /
f1sh

11

কেবলমাত্র ক্যালেন্ডার অবজেক্টে মিলগুলিতে সময় নির্ধারণ করুন

Calendar c = Calendar.getInstance();
c.setTimeInMillis(1385355600000l);
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DAY_OF_MONTH));
// get Date
System.out.println(c.getTime());

9

ঐ সম্ভবত মধ্যে টাইমস্ট্যাম্প হয় সেকেন্ড এবং না মিলিসেকেন্ড যা জাভা নতুন তারিখ (দীর্ঘ) কন্সট্রাকটর জন্য প্রয়োজন। এগুলি কেবল 1000 দ্বারা গুণ করুন এবং আপনার উচিত ঠিক।


23
আরও সঠিকভাবে 30000 মিলি
সেকেন্ড

5

দীর্ঘ মানগুলি সম্ভবত ইপচ টাইমস্ট্যাম্পগুলির সাথে সামঞ্জস্যপূর্ণ এবং মানগুলি হ'ল :

1220227200 = সোমবার, 01 সেপ্টেম্বর 2008 00:00:00 GMT

1220832000 = সোমবার, 08 সেপ্টেম্বর 2008 00:00:00 GMT

1221436800 = সোমবার, 15 সেপ্টেম্বর 2008 00:00:00 GMT

যে কেউ এই দীর্ঘ মানকে java.util.Date এ রূপান্তর করতে পারে, java.util তথ্যটি বিবেচনায় নিয়ে ate

// note: enforcing long literals (L), without it the values would just be wrong.
Date date = new Date(1220227200L * 1000L); 

এখন, তারিখটি সঠিকভাবে প্রদর্শন করতে, java.text ব্যবহার করতে পারবেন।

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("Wrong date time value: " + date);
System.out.println("Correct date time value: " + df.format(date));

তারিখ ফরম্যাটটি ব্যবহার না করে এবং ব্যবহার না করে java.util.Date এ রূপান্তরিত দীর্ঘ মান প্রদর্শনের ফলাফল নীচে রয়েছে:

Date wrong (off by 2 hours): Mon Sep 01 02:00:00 CEST 2008
Correct date : Monday, 1 September 2008 00:00:00 o'clock UTC


2

1220227200 15 জানুয়ারী 1980 (এবং প্রকৃতপক্ষে নতুন তারিখ (1220227200) এর সাথে সম্পর্কিত to আপনি যদি একটি তারিখে একটি দীর্ঘ মান পাস করেন তবে তা 01/01/1970 এর আগে এটি প্রকৃতপক্ষে 01/01/1970 তারিখ ফিরিয়ে দেবে। আপনার মানগুলি এই পরিস্থিতিতে না রয়েছে তা নিশ্চিত করুন (82800000 এর চেয়ে কম)।


2

তারিখের ফর্ম্যাটটি সামঞ্জস্য করে এটি ব্যবহার করে দেখুন।

long longtime = 1212580300;
SimpleDateFormat dateFormat = new SimpleDateFormat("MMddyyHHmm");
Date date = (Date) dateFormat.parseObject(longtime + "");
System.out.println(date);

দ্রষ্টব্য: 24 ঘন্টা বা 12 ঘন্টা চক্র পরীক্ষা করুন।


0

নতুন তারিখ (নম্বর) একটি তারিখ ফেরত দেয় number 1 জানুয়ারী 1970 পরে মিলি সেকেন্ডের Od

সঠিক পার্সিং রাউটিং অনুসারে আপনাকে তারিখটি পার্স করতে হবে। আমি জানি না যে 1220227200 কী, তবে এটি 1 জানুয়ারী 1970 এর পরে যদি সেকেন্ড হয়, তবে এটির পরিমাণটি মিলি সেকেন্ডে অর্জন করতে। যদি তা না হয় তবে 1970 এর পরে কিছু উপায়ে এটি মিলিসেকেন্ডে রূপান্তর করুন (আপনি যদি java.util.Date ব্যবহার করতে চান)।


0

আমার জন্য কাজ কর. আপনি সম্ভবত এটি 1000 এর সাথে গুণ করতে চান, যেহেতু আপনি যা পাবেন তা 1970 সাল থেকে সেকেন্ড এবং আপনাকে জানুয়ারী 1 থেকে 1970 সেকেন্ডে পাস করতে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.