জাভা 8 তে ইউটিসি + 0 তারিখ কীভাবে পাবেন?


108

জাভাতে ডেট ক্লাস নিয়ে আমার সমস্যা আছে। তারিখ শ্রেণি স্থানীয় মেশিনের তারিখ ফেরত দেয় তবে আমার ইউটিসি -0 দরকার।

আমি জাভাস্ক্রিপ্টের জন্য গুগল করেছিলাম এবং দুর্দান্ত সমাধান খুঁজে পেয়েছি তবে জাভাটির জন্য দরকারী নয়।

জাভা 8 তে ইউটিসি + 0 তারিখ কীভাবে পাবেন?


12
java.util.Dateস্থানীয় মেশিনের তারিখ কখনই হয় না। এটি সর্বদা ইউটিসি + 00: 00 এর তুলনায় 1970-01-01 থেকে বিচ্ছিন্ন মিলিসেক হিসাবে সংজ্ঞায়িত হয়। সম্ভবত এর পদ্ধতির আচরণ toString()আপনাকে বিভ্রান্ত করে যা প্রকৃতপক্ষে স্থানীয় সময় অঞ্চলে একটি উপস্থাপনা ব্যবহার করে।
মেনো হচসচাইল্ড

একটি সম্ভাব্য উত্তর প্রশ্নের উত্তর পাওয়া যাবে: স্ট্যাকওভারফ্লো.com
প্রিয়া জৈন

উত্তর:


146

জাভা 8 দিয়ে আপনি লিখতে পারেন:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

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

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;

1
ধন্যবাদ। এটি জোনডেটটাইমকে ডেটে বা লং (এমএস) রূপান্তর করা সম্ভব?
চিহ্নিত করুন

7
এই জবাবের কোডটি প্রযুক্তিগতভাবে কাজ করার OffsetDateTimeসময় ZonedDateTime, আমরা একটি পূর্ণ সময়ের অঞ্চলের পরিবর্তে কেবল অফসেট-থেকে-ইউটিসি-এর সাথে কাজ করছি তার চেয়ে বেশি ব্যবহার করা কি উপযুক্ত হবে না ?
বাসিল বাউরক

179

TL; ড

Instant.now()

java.time

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

Instant

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

Instant instant = Instant.now();

toStringপদ্ধতি টেক্সট মান একটি ব্যবহার তারিখ-সময় মান প্রতিনিধিত্বমূলক সঙ্গে স্ট্রিং অবজেক্ট উত্পন্ন আইএসও 8601 ফরম্যাটের।

String output = instant.toString();  

2016-06-27T19: 15: 25.864Z

Instantবর্গ java.time একটি মৌলিক বিল্ডিং-ব্লক বর্গ। তারিখ-সময় পরিচালনা করার সময় এটি আপনার ক্লাস হওয়া উচিত কারণ সাধারণত ইউটিসিতে তারিখ-সময় মানগুলি ট্র্যাক করা, সঞ্চয় করা এবং আদান-প্রদান করা সবচেয়ে ভাল অনুশীলন।

OffsetDateTime

তবে Instantবিকল্প ফর্ম্যাটে স্ট্রিং উত্পন্ন করার জন্য বিন্যাসকরণের বিকল্পগুলির মতো সীমাবদ্ধতা রয়েছে। আরও নমনীয়তার জন্য, এ থেকে রূপান্তর Instantকরুন OffsetDateTimeইউটিসি থেকে অফসেট নির্দিষ্ট করুন । জাভা.টাইমে এর অর্থ একটি ZoneOffsetঅবজেক্ট। এখানে আমরা ইউটিসি (+00) এর সাথে লেগে থাকতে চাই যাতে আমরা সুবিধাজনক ধ্রুবকটি ব্যবহার করতে পারি ZoneOffset.UTC

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19: 15: 25.864Z

বা Instantক্লাস বাদ দিন ।

OffsetDateTime.now( ZoneOffset.UTC )

এখন OffsetDateTimeহাতে থাকা কোনও বস্তুর DateTimeFormatterসাহায্যে আপনি বিকল্প বিন্যাসে পাঠ্য সহ স্ট্রিং অবজেক্ট তৈরি করতে ব্যবহার করতে পারেন। ব্যবহারের অনেক উদাহরণের জন্য অনুসন্ধান স্ট্যাক ওভারফ্লো DateTimeFormatter

ZonedDateTime

আপনি যখন নির্দিষ্ট সময় অঞ্চলের জন্য প্রাচীর-ঘড়ির সময় প্রদর্শন করতে চান , একটি ZoneIdপেতে একটি প্রয়োগ করুন ZonedDateTime

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

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15: 15: 25.864-04: 00 [আমেরিকা / মন্ট্রিল]

রূপান্তর

আপনার যদি পুরানো তারিখের সময় ক্লাসগুলি এড়ানো উচিত, তবে আপনাকে অবশ্যই পুরানো ক্লাসগুলিতে যুক্ত নতুন পদ্ধতি ব্যবহার করে রূপান্তর করতে পারেন। এখানে আমরা ব্যবহার করি java.util.Date.from( Instant )এবং java.util.Date::toInstant

java.util.Date utilDate = java.util.Date.from( instant );

এবং অন্য দিকে যাচ্ছে।

Instant instant= utilDate.toInstant();

একইভাবে, রূপান্তর করতে এবং থেকে রূপান্তর করতে GregorianCalendar(সাবক্লাস অব Calendar) যুক্ত হওয়া নতুন পদ্ধতিগুলির সন্ধান করুন java.time.ZonedDateTime

আধুনিক জাভা.টাইম বনাম উত্তরাধিকারে তারিখ-কালীন ধরণের ধরণের সারণী।

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

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

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

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

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

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


3
বলার অপেক্ষা রাখে না ডিএসটি একটি অ-ইন্দ্রিয় :-) জন্য প্রশংসা করি
prash

সুতরাং ডিএসটি যদি না ZonedDateTimeথাকত তবে প্রয়োজনের দরকার পড়েনি যেহেতু আমরা কেবল ZoneIdযেটি ZoneOffsetব্যবহার করতে পারি তার সবগুলিই ম্যাপ করে OffsetDateTime?
উইলমোল

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

1
চমত্কার উত্তর! আপনি যে সময়টি দিয়েছেন তাতে আমি সত্যিই প্রশংসা করি। :)
drognisep

জোনআইড.ওফ ("আমেরিকা / মন্ট্রিল"); কেন কেউ জেডকে এ জাতীয় জিনিস আবিষ্কার করবে? এটি কুৎসিত, ঘৃণ্য, রান-টাইম অবধি কোনও ভুল আছে কিনা তা বলছে না, এই হার্ড কোডটি কে মনে রাখতে পারে? কেন এটি ENUM ক্লাসে প্ররোচিত করবেন না?
ওয়ার্কপ্লেফ্লাইফাইসাইকেল

4

জাভা 8-তে, আমি Instantক্লাসটি ব্যবহার করব যা ইতিমধ্যে ইউটিসিতে রয়েছে এবং এতে কাজ করা সুবিধাজনক।

import java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

বিকল্পভাবে, আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

import java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

আবার Instant

Instant ins4 = Instant.from(odt);

3
না, একটি Instantহল না স্থানীয় সময়। একটি Instantদ্বারা সংজ্ঞা ইউটিসি হয়। সুতরাং এই উত্তরে দেখা মেশিনগুলির কোনও প্রয়োজন নেই ইউটিসি-তে প্রবেশের চেষ্টা করা; Instantইতিমধ্যে হয় ইউটিসি হবে। আরও তথ্যের জন্য এবং আরও সহজ কোডের জন্য আমার উত্তর দেখুন ।
তুলসী বাউরক

মন্তব্যের জন্য ধন্যবাদ.
আবেল তেরেফ


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