জাভা.ইটিল.ডেটের সময় অঞ্চল কীভাবে সেট করবেন?


225

আমি একটি java.util.Dateথেকে একটি পার্স করেছি Stringতবে এটি স্থানীয় সময় অঞ্চলটিকে dateঅবজেক্টের সময় অঞ্চল হিসাবে সেট করছে ।

Stringযেখান থেকে Dateপার্স করা হয়েছে তাতে সময় অঞ্চল নির্দিষ্ট করা হয়নি। আমি dateঅবজেক্টের একটি নির্দিষ্ট সময় অঞ্চল নির্ধারণ করতে চাই ।

আমি এটা কিভাবে করবো?


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

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

উত্তর:


315

ডেটফর্ম্যাট ব্যবহার করুন। উদাহরণ স্বরূপ,

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse("2010-05-23T09:01:02");

6
তারিখটি যদি ক্যালেন্ডার শ্রেণি থেকে তৈরি করা হয় তবে আপনি ক্যালেন্ডারের জন্য সময় অঞ্চল নির্ধারণ করতে পারেন।
lwpro2

19
@ lwpro2 যে বিবৃতিটি বিভ্রান্তিমূলক; আপনি একটি ক্যালেন্ডার অবজেক্টের জন্য সময় অঞ্চল নির্ধারণ করতে পারেন, তবে গেটটাইম () পদ্ধতিটি ব্যবহার করে এর থেকে তারিখ অবজেক্ট পাওয়া হোস্ট কম্পিউটারের টাইম জোনের সাথে একটি ডেট অবজেক্ট ফিরিয়ে দেবে।
BrDaHa

02/20/15 14:44 পার্স করতে আমার সমস্যা হচ্ছে। যে কেউ সহায়তা করতে পারে
এমএস

@ ব্রাডাহা সঠিক। আপনি TimeZone.setDefault()কল করার আগে আপনার প্রয়োজন হবে getTime()যাতে নতুন তারিখের অবজেক্টটি আপনি যে টাইম জোনে চান তা হতে পারে। JDK 1.8 সালে Calendar.getTime()আহ্বান return new Date(getTimeInMillis());
jpllosa

182

সচেতন থাকুন যে java.util.Dateঅবজেক্টগুলিতে নিজের দ্বারা কোনও টাইমজোন তথ্য নেই - আপনি কোনও Dateবস্তুর উপর সময় অঞ্চল নির্ধারণ করতে পারবেন না । একটি জিনিস যা কেবলমাত্র একটি Dateউপাদান রয়েছে "যুগ" থেকে 1 মিলিয়ন সেকেন্ড - 1 জানুয়ারী 1970, 00:00:00 ইউটিসি।

জেডজেড কোডার যেমন দেখায়, আপনি DateFormatকোন সময় অঞ্চলটিতে তারিখ এবং সময়টি প্রদর্শন করতে চান তা জানাতে আপনি এই অবজেক্টের সময়সীমাটি সেট করে রেখেছেন ।


77
গুগলিং, পরীক্ষা-নিরীক্ষার পরে এবং আমি বুঝতে পেরেছি যে এটি উত্তরের একটি সঠিক এবং সহায়ক সংযোজন - এবং হাইলাইট করার মতো মূল্য: তারিখে কেবলমাত্র মিলিসেকেন্ডের মান থাকে । আপনি যদি উত্সটি দেখেন তবে সেখানে কেবলমাত্র একটি longক্ষেত্র রয়েছে fastTime। এই মিলিসেকেন্ড সময়টি ব্যাখ্যা করতে Date.toString()আসলে একটি ব্যবহার করে Calendar। সুতরাং একটি মুদ্রণ আউট Dateএটি একটি (ডিফল্ট) টাইমজোন আছে বলে মনে হয়, কিভাবে সেই সময় অঞ্চল নির্ধারণ সম্পর্কে বোধগম্য প্রশ্নাবলীর জন্ম দেয়।
ডেভিড কার্বোনি

3
তারিখের অবজেক্টগুলির ভিতরে টাইমজোন তথ্য রয়েছে। তবে এটি সত্য হতে পারে, আপনি এটি পরিবর্তন করতে পারবেন না।
lwpro2

3
@ আইড্রোপ্রো 2, জেস্পার দাবি করেছেন (এবং আমি সম্মত) যে তারিখ অবজেক্ট কোনও সময় অঞ্চল সংরক্ষণ করে না। আপনি যদি দাবি করছেন যে সময় অঞ্চলটি java.util.Date- র মধ্যে সঞ্চিত আছে দয়া করে একটি রেফারেন্স সরবরাহ করুন।
জিম

6
@ জিম, এটি java.util.Date এর উত্স কোড। এটিতে ইউনিক্স যুগ হিসাবে ফাস্টটাইম পাশাপাশি বেসক্যালেন্ডার রয়েছে ate এটিতে টাইমজোন সম্পর্কিত তথ্য রয়েছে। আমি এটি বুঝতে পারি যাতে কোনও তারিখের উদাহরণে টাইমজোন সম্পর্কিত তথ্য থাকতে পারে, তবে এটি নাও পারে।
eis

2
@ জিম আমি আপনাকে বলিনি যে আপনি এটি সেট করতে পারেন, আমি বলছিলাম যে এটিতে এই তথ্য রয়েছে। আমি এটি ব্যবহারকারী হিসাবে সেট করার কোনও উপায় দেখতে পাচ্ছি না। আমি মনে করি যে ওপিতে এটি ঠিক আছে এটি সর্বদা ব্যবহারকারী / সিস্টেমের ডিফল্ট টাইমজোন বলে মনে হয়।
eis

95

TL; ড

একটি স্ট্রিং থেকে… পার্স করা হয়েছে ... সময় অঞ্চল নির্দিষ্ট করা হয়নি ... আমি একটি নির্দিষ্ট সময় অঞ্চল নির্ধারণ করতে চাই

LocalDateTime.parse( "2018-01-23T01:23:45.123456789" )  // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
    .atZone( ZoneId.of( "Africa/Tunis" ) )              // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.

জুন তারিখের সময় অঞ্চল নেই

অন্যান্য সঠিক উত্তরের বিবৃত হিসেবে, একটি java.util.Date কোন সময় জোন হয়েছে । এটি ইউটিসি / জিএমটি (কোনও টাইম জোন অফসেট নয়) উপস্থাপন করে। খুব বিভ্রান্তিকর কারণ এর toStringস্ট্রিং প্রতিনিধিত্ব করার সময় এর পদ্ধতিটি JVM- র ডিফল্ট সময় অঞ্চল প্রয়োগ করে।

জুডেট এড়িয়ে চলুন

এটি এবং অন্যান্য অনেক কারণে, আপনার বিল্ট-ইন java.util. তারিখ এবং .ক্যালেন্ডার এবং java.text.SimpleDate Format ব্যবহার এড়ানো উচিত। তারা কুখ্যাত ঝামেলা হয়।

পরিবর্তে জাভা 8 এর সাথে বান্ডিলযুক্ত জাভা.টাইম প্যাকেজটি ব্যবহার করুন ।

java.time

জাভা.টাইম ক্লাসগুলি তিনটি উপায়ে টাইমলাইনে একটি মুহুর্তের প্রতিনিধিত্ব করতে পারে:

  • ইউটিসি ( Instant)
  • অফসেট সহ ( OffsetDateTimeসাথে ZoneOffset)
  • একটি সময় অঞ্চল সহ ( ZonedDateTimeসাথে ZoneId)

Instant

ইন java.time , মৌলিক বিল্ডিং ব্লক হয় Instant, ইউটিসি সময় লাইনে একটি মুহূর্ত। Instantআপনার ব্যবসায়িক যুক্তির বেশিরভাগ ক্ষেত্রে অবজেক্টগুলি ব্যবহার করুন ।

Instant instant = Instant.now();

OffsetDateTime

কিছু লোকালের প্রাচীর-ঘড়ির সময়গুলিতে সামঞ্জস্য করতে অফসেট-থেকে-ইউটিসি প্রয়োগ করুন ।

একটি ZoneOffsetপেতে একটি প্রয়োগ করুন OffsetDateTime

ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );

ZonedDateTime

একটি টাইম জোন প্রয়োগ করা আরও ভাল , একটি অফসেট প্লাস এবং ডায়ালাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলি পরিচালনা করার নিয়ম ।

একটি আবেদন ZoneIdএকটি থেকে Instantএকটি পেতে ZonedDateTime। সর্বদা যথাযথ টাইম জোনের নাম উল্লেখ করুন । কখনও যেমন 3-4 বর্ণমালা ব্যবহার ESTবা ISTযে তন্ন তন্ন অনন্য কিংবা মান আছে।

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

LocalDateTime

যদি ইনপুট স্ট্রিংটিতে অফসেট বা জোনের কোনও সূচকের অভাব হয় তবে একটি হিসাবে পার্স করুন LocalDateTime

আপনি যদি নির্দিষ্ট সময় অঞ্চল সম্পর্কে নিশ্চিত হন তবে একটি ZoneIdউত্পাদন করার জন্য একটি বরাদ্দ করুন ZonedDateTime। উপরে tl; dr বিভাগে কোডের উদাহরণটি দেখুন ।

ফর্ম্যাট স্ট্রিংস

toStringমানক আইএসও 8601 ফর্ম্যাটে তারিখ-সময় মান উপস্থাপন করে একটি স্ট্রিং উত্পন্ন করতে এই তিনটি শ্রেণীর যে কোনও একটিতে পদ্ধতি কল করুন । ZonedDateTimeবর্গ বন্ধনী সময় অঞ্চল নামে সংযোজন করে প্রমিত বিন্যাস প্রসারিত করে।

String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]

অন্যান্য ফর্ম্যাটগুলির জন্য DateTimeFormatterক্লাস ব্যবহার করুন । সাধারণত শ্রেণীর ব্যবহারকারীর প্রত্যাশিত মানব ভাষা এবং সাংস্কৃতিক নিয়ম ব্যবহার করে স্থানীয় ফর্ম্যাট তৈরি করতে দেওয়া সর্বোত্তম। অথবা আপনি একটি নির্দিষ্ট ফর্ম্যাট নির্দিষ্ট করতে পারেন।


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


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

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

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

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

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

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

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


Joda-টাইম

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

ইন Joda-টাইম , একটি তারিখ-সময় বস্তু ( DateTime) নিশ্চয় তার নির্ধারিত সময়ের অঞ্চল জানে। এর অর্থ ইউটিসি থেকে অফসেট এবং সেই সময় অঞ্চলের ডায়ালাইট সেভিং টাইম (ডিএসটি) এবং এই জাতীয় অন্যান্য অসঙ্গতিগুলির নিয়ম এবং ইতিহাস from

String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );

আইএসও 8601 ফর্ম্যাটে toStringএকটি স্ট্রিং উত্পন্ন করতে পদ্ধতিটি কল করুন ।

String output = dateTimeIndia.toString();

জোদা-টাইম অন্যান্য স্ট্রিং ফর্ম্যাটগুলির সমস্ত ধরণের উত্সর্গের জন্য সমৃদ্ধ ক্ষমতা সরবরাহ করে।

প্রয়োজনে, আপনি জোডা-টাইম ডেটটাইম থেকে জাভা.ইউটি.এল.তে রূপান্তর করতে পারেন।

Java.util.Date date = dateTimeIndia.toDate();

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


বাস্তবিক সেখানে হয় কোন সময় জোন একটি java.util.Date এমবেড, কিছু অভ্যন্তরীণ কাজকর্মের জন্য ব্যবহৃত (এই উত্তরে মন্তব্য দেখুন)। তবে এই অভ্যন্তরীণ সময় অঞ্চলটি সম্পত্তি হিসাবে প্রকাশিত হয়নি এবং সেট করা যায় না। এই অভ্যন্তরীণ সময় জোন না দ্বারা ব্যবহৃত এক toStringতারিখ-সময় মান একটি স্ট্রিং উপস্থাপনা উৎপাদিত পদ্ধতি; পরিবর্তে JVM- র বর্তমান ডিফল্ট সময় অঞ্চলটি অন-ফ্লাইতে প্রয়োগ করা হয়েছে। সুতরাং, শর্টহ্যান্ড হিসাবে, আমরা প্রায়শই বলে থাকি যে "জুলাইটির কোনও সময় অঞ্চল নেই"। বিভ্রান্তিকর? হ্যাঁ. এই ক্লান্ত পুরাতন ক্লাসগুলি এড়ানোর আরও একটি কারণ।


3
"জুডেটে টাইম জোন নেই" ভুল। BaseCalendar.Date cdateযদি সেট করা থাকে তবে তার সম্পত্তিতে জুডেটে একটি টাইমজোন তথ্য রয়েছে । সোর্স কোডটি এখানে দেখুন । কল করে জেভিএমের ডিফল্ট সময় অঞ্চল পরিবর্তন না করে আপনি কোনও জুডেট অবজেক্টের টাইমজোন সেট করতে পারবেন না TimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));। সুতরাং, একটি টাইমজোন অফসেট রয়েছে এবং আপনি অবহিত পদ্ধতিতে জুনডেট.সেটটাইমজোনঅফসেট () কল করে অফসেটটি পেতে পারেন
থাই

3
@ ব্লকিউথাই সঠিক, আপনি আপনার বাড়ির কাজটি করেছেন। আমি যেমন করেছি, আগে সেই উত্স কোডটি দেখেছি। সেখানে হয় কোন সময় জোন সেখানে দাফন করা। তবে সমস্ত ব্যবহারিক উদ্দেশ্যে সেই সময় অঞ্চলটিকে অগ্রাহ্য করা হয়। একটি জাভা.ইউটি.এল.টি কোনও সময় অঞ্চল ছাড়াই কাজ করে, কার্যকরভাবে ইউটিসি-তে থাকে, যখন সেই সমাহিত সময় অঞ্চলটিকে উপেক্ষা করে। toStringJVM- র বর্তমান ডিফল্ট সময় অঞ্চল প্রয়োগ করে এমন পদ্ধতি ব্যতীত ; আবার সমাহিত সময় অঞ্চল উপেক্ষা করে। সুতরাং ব্রিভিটির জন্য, আমরা বলি একটি java.util. তারিখের কোনও সময় অঞ্চল নেই। আর্টের মতো এটিও একটি মিথ্যা যা সত্য বলে।
বাসিল বাউর্ক

@ ব্লকিউথাই কল করার ক্ষেত্রে TimeZone.setDefault, আপনি java.util.Date অবজেক্টের সময় অঞ্চল নির্ধারণ করছেন না - তারিখ অবজেক্টটি এখনও তার সমাহিত সময় অঞ্চলটিকে উপেক্ষা করে, ইউটিসিতে কার্যকরভাবে কাজ করে। আপনি তারিখের toStringপদ্ধতি প্রভাবিত করবে । ডিফল্ট সেট করা JVM এর ডিফল্ট সময় অঞ্চল পরিবর্তন করে যা সাধারণত হোস্ট অপারেটিং সিস্টেমের টাইম জোনে সেট থাকে। সেই কলটি সুপারিশ করা হয়নি কারণ এটি সেই জেভিএম-এ চলমান সমস্ত অ্যাপ্লিকেশনের সমস্ত থ্রেডের সমস্ত কোডকে প্রভাবিত করে এবং তারা কার্যকর করার সাথে সাথে ফ্লাইও করে। অভদ্র এবং বিপজ্জনক হওয়ার কারণে, এই কলটি কেবলমাত্র সর্বশেষ উপায় হিসাবে বিবেচনা করা উচিত।
বাসিল বাউর্ক

5
যে সময় অঞ্চল খুব প্রায়ই ব্যবহার করা হয় (ব্যবহৃত equals, hashcode, getTime..) আপনি কটাক্ষপাত করা তাহলে equalsপদ্ধতি, এটা কল getTime()যা কল getTimeImpl(), যা কল normalize()যদি cdateসম্পত্তি স্বাভাবিক নয়। ইন normalize()পদ্ধতি, গত যদি শর্ত তার সঞ্চিত সময় অঞ্চল তথ্যের উপর ভিত্তি করে পুনরায় হিসাব 1/1/70 থেকে মিলিসেকেন্ড যদি এর সময় অঞ্চল cdateবর্তমান জেভিএম পরিবেশ এটা চলতে থাকে এর সময় অঞ্চল থেকে আলাদা। (একবার দেখুন sun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date))
থাই বুই

2
@ মিচালম আপনার পরামর্শ অনুসারে, কিছু সময় আগে আমি এমবেডড জোন সম্পর্কে একটি উত্তর যুক্ত করেছি।
তুলসী বাউরকে

75

আপনি জেভিএম স্তরেও সময় অঞ্চল নির্ধারণ করতে পারেন

Date date1 = new Date();
System.out.println(date1);

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
// or pass in a command line arg: -Duser.timezone="UTC"

Date date2 = new Date();
System.out.println(date2);

আউটপুট:

Thu Sep 05 10:11:12 EDT 2013
Thu Sep 05 14:11:12 UTC 2013

এটি আমাকে সাহায্য করেছিল। এসডিএফ-এ সময় নির্ধারণের সময় অঞ্চল কোনও পার্থক্য করেনি
বিষ্ণু বিশ্বনাথ

আমি এটি আরও নির্ভরযোগ্য মনে করি। (+1)
foobar

23
সাবধানতা: কলিং TimeZone.setDefaultবরং কঠোর, কারণ এটি পুরো জেভিএমকে প্রভাবিত করে, অন্যান্য সমস্ত বস্তু এবং থ্রেডকে প্রভাবিত করে। আপনি যদি সিকিউরিটি ম্যানেজারের সাথে চালাচ্ছেন তবে আরও জটিলতা সহ বিশদ বিবরণের জন্য এই উত্তরটি দেখুন । আরও জটিলতা যুক্ত করা: এই আচরণটি জাওয়ার বিভিন্ন সংস্করণে পরিবর্তিত হয়েছে, যেমনটি এই প্রশ্নে আলোচনা করা হয়েছে ।
বেসিল বাউরুক

এই স্টেটমেন্টের পরে তৈরি সমস্ত থ্রেডগুলিতে এটি একটি সাধারণ টাইমজোন সেট করে, তাই না?
জয়দেব

এটি গৃহীত প্রশ্নের চেয়ে প্রশ্নের উত্তম উত্তর।
ফ্রাঙ্কোগ্রেেক্স

10

আপনার যদি অবশ্যই মানক জেডিকে ক্লাস নিয়ে কাজ করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন:

/**
 * Converts the given <code>date</code> from the <code>fromTimeZone</code> to the
 * <code>toTimeZone</code>.  Since java.util.Date has does not really store time zome
 * information, this actually converts the date to the date that it would be in the
 * other time zone.
 * @param date
 * @param fromTimeZone
 * @param toTimeZone
 * @return
 */
public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone)
{
    long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone);
    long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone);

    return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset));
}

/**
 * Calculates the offset of the <code>timeZone</code> from UTC, factoring in any
 * additional offset due to the time zone being in daylight savings time as of
 * the given <code>date</code>.
 * @param date
 * @param timeZone
 * @return
 */
private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone)
{
    long timeZoneDSTOffset = 0;
    if(timeZone.inDaylightTime(date))
    {
        timeZoneDSTOffset = timeZone.getDSTSavings();
    }

    return timeZone.getRawOffset() + timeZoneDSTOffset;
}

ক্রেডিট এই পোস্টে যায় ।


1
টাইমজোনগুলির অফসেট সবসময় ধ্রুবক হয় না। প্রকৃতপক্ষে, ভূ-রাজনৈতিক কারণে এগুলি পরিবর্তন হতে পারে। টাইমজোন.জেটডিএসটি সঞ্চয়গুলি () এটিকে বিবেচনায় নেয় না এবং সর্বদা বর্তমান অফসেটটি দেয়। এর অর্থ হ'ল আপনি যদি কোনও imeতিহাসিক তারিখের সাথে কোনও টাইমজোন / টাইমজোন যা date তারিখের পরে থেকে অফসেটগুলিতে পরিবর্তন করেছেন তার সাথে withতিহাসিক তারিখটির সাথে আচরণ করছেন তবে আপনি একটি ভুল রূপান্তর পেতে পারেন।
andrerobot

6

java.util.Calendarকেবল জেডিকে ক্লাস ব্যবহার করে সময় অঞ্চল পরিচালনা করার স্বাভাবিক উপায়। অ্যাপাচি কমন্সে আরও কিছু বিকল্প / ইউটিলিটি রয়েছে যা সহায়ক হতে পারে। সম্পাদনা স্পঞ্জের নোটটি আমাকে মনে করিয়ে দিয়েছে যে আমি জোদা-সময় সম্পর্কে সত্যই ভাল জিনিস শুনেছি (যদিও আমি নিজে এটি ব্যবহার করি নি)।


জোদা সময়ের জন্য +1 যদিও এটি কোনও অতিরিক্ত কার্যকারিতা সরবরাহ করে না যা আপনি স্ট্যান্ডার্ড জাভা এপিআই থেকে পাবেন না (এটি আমি কোনও ক্ষেত্রে খুঁজে পেয়েছি - অন্যথায় দেখায় খুশি হয়েছি), জোদা সময় কিছু কাজ সহজ করে দেয়।
জোশুয়া হাচিসন

2
@JoshuaHutchison Joda-সময় আছে টন অতিরিক্ত কার্যকারিতা। উদাহরণ: প্রতিনিধিত্ব শ্রেণীর সঙ্গে সময় ধারন Period, Durationএবং Interval। সেই ধারন তুলনা পদ্ধতিগুলোর মধ্যে রয়েছে যেমন contains, abuts, overlap, এবং gap। এবং PeriodFormatterBuilder"15 বছর 8 মাস" এর মতো বর্ণনামূলক বাক্যাংশ তৈরি করতে পারে।
বাসিল বাউর্ক

1

তারিখটিকে স্ট্রিংয়ে রূপান্তর করুন এবং সিম্পলডেটফর্ম্যাট দিয়ে এটি করুন।

    SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    readFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timezoneOffset));
    String dateStr = readFormat.format(date);
    SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date date = writeFormat.parse(dateStr);

1
স্ট্যাক ওভারফ্লোতে উত্তরগুলির কিছু আলোচনা বা ব্যাখ্যা হবে বলে আশা করা হচ্ছে। এই সাইটটি কোড স্নিপেট লাইব্রেরির চেয়ে বেশি বোঝানো হচ্ছে।
বাসিল বাউরক

আপনার মন্তব্যের জন্য @ বাসিল বাউরকে ধন্যবাদ আমি উত্তরটি সম্পাদনা করি
avisper

0

যদি কারও XMLGregorianCalendarকাছে এটির প্রয়োজন হয়, যদি আপনাকে ইউটিসি থেকে আপনার বর্তমান টাইমজোনকে টাইমজোন রূপান্তর করতে হয়, তবে আপনাকে যা করার দরকার তা হ'ল সময় অঞ্চল নির্ধারণ করা হবে 0, তারপরে কল করুন toGregorianCalendar()- এটি একই টাইমজোনেই থাকবে, তবে Dateকীভাবে রূপান্তর করতে হবে তা জানে আপনার, যাতে আপনি সেখান থেকে তথ্য পেতে পারেন।

XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(
        ((GregorianCalendar)GregorianCalendar.getInstance());
xmlStartTime.setTimezone(0);
GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar();
Date startDate = startCalendar.getTime();
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(startCalendar);
xmlStartTime.setHour(startDate.getHours());
xmlStartTime.setDay(startDate.getDate());
xmlStartTime.setMinute(startDate.getMinutes());
xmlStartTime.setMonth(startDate.getMonth()+1);
xmlStartTime.setTimezone(-startDate.getTimezoneOffset());
xmlStartTime.setSecond(startDate.getSeconds());
xmlStartTime.setYear(startDate.getYear() + 1900);
System.out.println(xmlStartTime.toString());

ফলাফল:

2015-08-26T12:02:27.183Z
2015-08-26T14:02:27.183+02:00

0

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

    Instant date = null;
    Date sdf = null;
    String formatTemplate = "EEE MMM dd yyyy HH:mm:ss";
    try {
        SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss");
        isoFormat.setTimeZone(TimeZone.getTimeZone(ZoneId.of("US/Pacific")));
        sdf = isoFormat.parse(timeAtWhichToMakeAvailable);
        date = sdf.toInstant();

    } catch (Exception e) {
        System.out.println("did not parse: " + timeAtWhichToMakeAvailable);
    }

    LOGGER.info("timeAtWhichToMakeAvailable: " + timeAtWhichToMakeAvailable);
    LOGGER.info("sdf: " + sdf);
    LOGGER.info("parsed to: " + date);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.