জিএমটি / ইউটিসি হিসাবে জাভা টাইমজোনকে চাপ দিন


100

মেশিনে টাইমজোন সেট না করেই আমাকে GMT / UTC- এর সাথে যে কোনও সময় সম্পর্কিত ক্রিয়াকলাপ জোর করতে হবে। কোডে তাই কোনও সুবিধাজনক উপায়?

স্পষ্ট করার জন্য, আমি সমস্ত ক্রিয়াকলাপের জন্য ডিবি সার্ভারের সময়টি ব্যবহার করছি, তবে এটি স্থানীয় টাইমজোন অনুসারে ফর্ম্যাট হয়ে আসে।

ধন্যবাদ!


আসলে, তার সমস্যাটি আমার একটি সাবসেট, তবে আমি একটি সমাধান খুঁজে পেয়েছি।
সাইবার

সদৃশ প্রশ্নটি দেখুন এবং "জোদা" এবং "ডেটটাইমজোন" অনুসন্ধান করুন।
তুলসী বাউরক

উত্তর:


127

চলমান জেভিএম-এর একক উদাহরণের জন্য ডিফল্ট সময় অঞ্চল পরিবর্তন করতে ওপি এই প্রশ্নের উত্তর দিয়েছে, user.timezoneসিস্টেম সম্পত্তিটি সেট করে :

java -Duser.timezone=GMT ... <main-class>

কোনও ডাটাবেস থেকে তারিখ / সময় / টাইমস্ট্যাম্প অবজেক্টগুলি পুনরুদ্ধার করার জন্য যদি আপনাকে নির্দিষ্ট সময় অঞ্চল নির্ধারণ করতে হয় তবে কোনও পদক্ষেপ গ্রহণকারী পদ্ধতিগুলির ResultSetদ্বিতীয় রূপটি ব্যবহার করুন :getXXXCalendar

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
    Date dateValue = rs.getDate("DateColumn", tzCal);
    // Other fields and calculations
}

বা, একটি প্রস্তুতিমূলক স্টেটমেন্টে তারিখ নির্ধারণ:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();

এগুলি নিশ্চিত করবে যখন ডাটাবেস কলামে সময় অঞ্চল তথ্য রাখে না তখন ডাটাবেসে সঞ্চিত মানটি সামঞ্জস্যপূর্ণ।

java.util.Dateএবং java.sql.Dateশ্রেণীর ইউটিসি প্রকৃত সময় (মিলিসেকেন্ডে) সংরক্ষণ করি। এটিকে আউটপুট থেকে অন্য টাইমজোনতে ফর্ম্যাট করতে, ব্যবহার করুন SimpleDateFormat। আপনি একটি ক্যালেন্ডার অবজেক্ট ব্যবহার করে মানের সাথে টাইমজোনও যুক্ত করতে পারেন:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);

ব্যবহারযোগ্য রেফারেন্স

https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377

https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-en वातावरण-841187402.html


পুরো জেভিএমের জন্য সময় অঞ্চল নির্ধারণের বিষয়ে একটি বিষয় লক্ষণীয় হ'ল এটি লগিংয়ের মতো জিনিসগুলি সহ সমস্ত কিছুকে প্রভাবিত করে। যদি এটি কাঙ্ক্ষিত প্রভাব হয় তবে মনে রাখবেন something
হারমান হান্স

হ্যাঁ, ঠিক আছে। একটি মাত্র উল্লেখ করার জন্য, আমি আসলে কোডের মধ্যে ইউজার টাইমজোনটি সেট করেছি, তারপরে -D প্যারামিটারের মাধ্যমে।
সাইবার

6
@ সাইবার: এটি কাজ করে তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে কোনও পদ্ধতিতে টাইমজোন.জেট ডেফল্ট () পদ্ধতি কল করার আগে আপনি এটি সেট করেছেন। যদি না হয় তবে আপনার প্রথমে কার্যকর হওয়ার পরে ডিফল্টটি ক্যাশে হওয়ার কারণে আপনার কিছুটা বিভ্রান্তি হবে। এর অর্থ হ'ল এটি কোনও সমস্যা হতে পারে যদি আপনি এটি কোনও API / লাইব্রেরির ভিতরে করেন (সরল দৃষ্টিকোণ থেকে লুকানো) - আপনি কী করছেন তা ভারীভাবে ডকুমেন্ট করতে ভুলবেন না।
কেভিন ব্রক

23

এছাড়াও আপনি যদি এইভাবে JVM টাইমজোন সেট করতে পারেন

System.setProperty("user.timezone", "EST");

বা -Duser.timezone=GMTJVM আরগগুলিতে।


System.setProperty("user.timezone" ...)কাজ করে না
উইলমল

13

আমাকে উইন্ডোজ 2003 সার্ভারের জন্য জেভিএম টাইমজোনটি সেট করতে হয়েছিল কারণ এটি সর্বদা নতুন তারিখের জন্য জিএমটি ফেরত ();

-Duser.timezone=America/Los_Angeles

অথবা আপনার উপযুক্ত সময় অঞ্চল। টাইম জোনের একটি তালিকা খুঁজে পাওয়াও কিছুটা চ্যালেঞ্জিং বলে প্রমাণিত হয়েছিল ...

এখানে দুটি তালিকা রয়েছে;

http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm


11

আপনি টাইমজোন.সেট ডিফল্ট () ব্যবহার করে সময় অঞ্চল পরিবর্তন করতে পারেন :

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))

কোনও অপরাধ নয়, তবে অস্থায়ীভাবে বৈশ্বিক স্থিতিশীল রাষ্ট্রের সংশোধন করা খুব খারাপ ধারণা বলে মনে হচ্ছে ...
জি ডেমেকি

আপনি করতে পারেন, কিন্তু আপনি করা উচিত নয়। এটি অসাধারণ খারাপ পরামর্শ। পুরো জেভিএম এর সময় অঞ্চল পরিবর্তন হয়েছে।
স্কট স্কট 13

4
কখনও কখনও এটি হ'ল আপনি যা অর্জন করতে চান। যেমন টাইম জোনের সমস্যা এড়াতে আমি জাটিভিত্তিক মাইক্রোসার্ফেসগুলি সর্বদা ইউটিসি-র সাথে চলতে দেখেছি। এই সিস্টেমে ডাটাবেস ব্যাকএন্ড ইউটিসি-র সাথেও চলে, সুতরাং জেভিএমকেও ইউটিসি-তে "বলপূর্বক" করা স্বাভাবিক। কী গুরুত্বপূর্ণ: আপনি কী করছেন এবং এর পরিণতিগুলি কী তা আপনি জানতে হবে ...
স্নোরবি

একেবারে না. আপনি যদি ইউটিসিতে আপনার পুরো সিস্টেমটি চান (খুব ভাল ধারণা), সিস্টেমের টাইমজোনটিকে ইউটিসিতে সেট করুন এবং জাভা টাইমজোনকে একা ছেড়ে যান।
স্কট

4
আপনার যদি বিভিন্ন প্রয়োজনীয়তার সাথে একাধিক জেভিএম থাকে তবে। আমরা চিরকাল তর্ক করতে পারি তবে প্রতিটি ক্ষেত্রেই অনন্য: কখনও কখনও আপনাকে পুরো সিস্টেমের টাইমজোনটি সেট করতে হয়, কখনও কখনও আপনি কেবল একটি জেভিএম সেট করেন set আসুন খুশি
হোন

8

আমার জন্য, কেবল দ্রুত সিম্পলডেট ফরমেট,

  private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
  private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
  static {
      GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
    SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
  }

তারপরে বিভিন্ন টাইমজোন দিয়ে তারিখটি ফর্ম্যাট করুন।


7

tl; ডা

String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;

ডিফল্ট সময় অঞ্চলের জন্য হোস্ট ওএস বা জেভিএম এর উপর নির্ভর করে এড়িয়ে চলুন

কাঙ্ক্ষিত / প্রত্যাশিত সময় অঞ্চলটি সুস্পষ্টভাবে বর্ণনা করার জন্য আমি আপনাকে সমস্ত কোড লিখার পরামর্শ দিচ্ছি। আপনার জেভিএমের বর্তমান ডিফল্ট টাইম জোনের উপর নির্ভর করতে হবে না। এবং যে জেভিএম বর্তমান ডিফল্ট সময় জোন পরিবর্তন করতে পারেন সচেতন হতে কোনো মুহূর্তে রানটাইম সময়, কোন কোড সহ যেকোনো অ্যাপ্লিকেশান কলিং কোন থ্রেড TimeZone.setDefault। এই জাতীয় কলটি তত্ক্ষণাত্ সেই জেভিএমের মধ্যে থাকা সমস্ত অ্যাপকে প্রভাবিত করে।

java.time

অন্যান্য উত্তরগুলির মধ্যে কিছু সঠিক ছিল, তবে এখন এটি তৈরি হয়েছে। জাভার প্রাথমিক সংস্করণগুলির সাথে বান্ডিল করা ভয়ানক তারিখ-কালীন ক্লাসগুলি ত্রুটিযুক্ত ছিল, এমন লোকেরা লিখেছিলেন যারা তারিখ-সময় পরিচালনার জটিলতা এবং সূক্ষ্মতাগুলি বুঝতে পারে না।

জেএসআর 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাস দ্বারা উত্তরাধিকারের তারিখ-সময় ক্লাসগুলি পরিপূর্ণ করা হয়েছে ।

একটি সময় অঞ্চল উপস্থাপন করতে, ব্যবহার করুন ZoneId। ইউটিসি থেকে অফসেট উপস্থাপন করতে, ব্যবহার করুন ZoneOffset। একটি অফসেট কেবল প্রধান মেরিডিয়ান এর পিছনে বা পিছনে বেশ কয়েকটি ঘন্টা-মিনিট-সেকেন্ড। একটি সময় অঞ্চল অনেক বেশি। একটি সময় অঞ্চল হ'ল একটি বিশেষ অঞ্চলের লোকদের দ্বারা ব্যবহৃত অফসেটের অতীত, বর্তমান এবং ভবিষ্যতের পরিবর্তনের ইতিহাস।

GMT / UTC- এ যে কোনও সময় সম্পর্কিত ক্রিয়াকলাপ জোর করা দরকার

শূন্য ঘন্টা-মিনিট-সেকেন্ডের অফসেটের জন্য, ধ্রুবকটি ব্যবহার করুন ZoneOffset.UTC

Instant

ইউটিসিতে বর্তমান মুহুর্তটি ক্যাপচার করতে, একটি ব্যবহার করুন Instant। এই শ্রেণিটি ইউটিসিতে একটি মুহুর্তের প্রতিনিধিত্ব করে, সর্বদা সংজ্ঞা অনুসারে ইউটিসিতে।

Instant instant = Instant.now() ;  // Capture current moment in UTC.

ZonedDateTime

নির্দিষ্ট অঞ্চলের লোকেরা ব্যবহৃত প্রাচীর-ঘড়ির সময় একই মুহূর্তটি দেখতে, একটি সময় অঞ্চলে সামঞ্জস্য করুন। একই মুহূর্ত, সময়রেখার একই পয়েন্ট, বিভিন্ন প্রাচীর-ঘড়ির সময়।

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

তথ্যশালা

আপনি একটি ডাটাবেস উল্লেখ।

ডাটাবেস থেকে একটি মুহূর্ত পুনরুদ্ধার করতে, আপনার কলামটি এসকিউএল-স্ট্যান্ডার্ডের মতো ডেটা টাইপের হওয়া উচিত TIMESTAMP WITH TIME ZONE। স্ট্রিংয়ের পরিবর্তে কোনও বস্তু পুনরুদ্ধার করুন। জেডিবিসি ৪.২ এবং তারপরে , আমরা জাভা.টাইম অবজেক্টগুলি ডাটাবেসের সাথে বিনিময় করতে পারি । OffsetDateTime, JDBC এর দ্বারা প্রয়োজন বোধ করা হয় যখন Instant& ZonedDateTimeঐচ্ছিক।

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

বেশিরভাগ ডাটাবেস এবং ড্রাইভারগুলিতে, আমি অনুমান করব যে ইউটিসিতে দেখা হিসাবে আপনি মুহূর্তটি পাবেন। তবে যদি তা না হয় তবে আপনি দুটি উপায়ের সাথে সামঞ্জস্য করতে পারেন:

  • এক্সট্র্যাক্ট একটি Instant: odt.toInstant()
  • প্রদত্ত অফসেট থেকে শূন্যের অফসেটে সামঞ্জস্য করুন: অফসেটডেটটাইম odtUtc = odt.withOffsetSameInstant (জোনঅফসেট.আউটসি); ``

জাভাতে তারিখের সময়ের ধরণের সারণী (উভয় উত্তরাধিকার এবং আধুনিক) এবং স্ট্যান্ডার্ড এসকিউএল


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

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

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

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

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

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


6

আমি ডিবি থেকে কাঁচা ফর্ম (লম্বা টাইমস্ট্যাম্প বা জাভা এর তারিখ) থেকে সময়টি পুনরুদ্ধার করব এবং তারপরে এটির ফর্ম্যাট করতে সিম্পলডেটফর্ম্যাট বা ক্যালেন্ডারটি ব্যবহার করে। উভয় ক্ষেত্রে আপনার ব্যবহারের আগে অবজেক্টের সময় অঞ্চল নির্ধারণ করা উচিত।

দেখুন SimpleDateFormat.setTimeZone(..)এবং Calendar.setTimeZone(..)বিশদ জন্য


1

ক্লায়েন্ট / সার্ভারের একটি জুড়ি তৈরি করুন, যাতে কার্যকর হওয়ার পরে ক্লায়েন্ট সার্ভারটি সঠিক সময় এবং তারিখ প্রেরণ করে। তারপরে, ক্লায়েন্ট সার্ভারকে জিএমটি জিজ্ঞাসা করে এবং সার্ভারটি উত্তরটি সরাসরি পাঠায়।


1

সিস্টেমের সম্পত্তি ব্যবহার করুন:

-Duser.timezone=UTC

5
কেন এটি ব্যবহার করা উচিত? দয়া করে আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি থেকে শিখতে পারে
নিকো হায়েস

1

আপনার টাইমজোনটি পুনরায় সেট করতে মাইএসকিউএলে এই লাইনটি কার্যকর করুন:

SET @@global.time_zone = '+00:00';

0

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


0

আশা করি কোডের নীচে আপনাকে সহায়তা করবে।

    DateFormat formatDate = new SimpleDateFormat(ISO_DATE_TIME_PATTERN);
    formatDate.setTimeZone(TimeZone.getTimeZone("UTC")); 
    formatDate.parse(dateString);

-6

আপনি যদি কেবল ইনটিজারের সাথে GMT সময় পেতে চান: var কারেন্টটাইম = নতুন তারিখ (); var কারেন্টইয়ার = '২০১০' var কারেন্টমোনথ = 10; var কারেন্টডে = '30 'var কারেন্টহর্স = '20' ভেরেন্ট কারেন্টমিনুটস = ​​'20 'ভেরেন্ট কারেন্টসেকেন্ডস = '00' ভার কারেন্টমিলিসেকেন্ড = '00 '

currentTime.setFullYear(currentYear);
currentTime.setMonth((currentMonth-1)); //0is January
currentTime.setDate(currentDay);  
currentTime.setHours(currentHours);
currentTime.setMinutes(currentMinutes);
currentTime.setSeconds(currentSeconds);
currentTime.setMilliseconds(currentMilliseconds);

var currentTimezone = currentTime.getTimezoneOffset();
currentTimezone = (currentTimezone/60) * -1;
var gmt ="";
if (currentTimezone !== 0) {
  gmt += currentTimezone > 0 ? ' +' : ' ';
  gmt += currentTimezone;
}
alert(gmt)

5
যা আমার কাছে জাভাস্ক্রিপ্ট (! = জাভা) এর মতো দেখাচ্ছে।
ফিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.