জাভা 8-এ জোনআইডকে জোনঅফসেটে রূপান্তর করার কোনও উপায় আছে কি?


89

আমার এক যুগের দ্বিতীয় এবং একটি জোনআইড রয়েছে, পদ্ধতি 1 দ্বারা এটি স্থানীয় ডিফল্ট টাইমকে সিস্টেম ডিফল্ট জোনআইডের সাথে রূপান্তরিত করা যেতে পারে, তবে আমি পদ্ধতি 2 দ্বারা স্থানীয় দ্বিতীয় তারিখের সাথে দ্বিতীয় যুগের রূপান্তর করার উপায় খুঁজে পাই না, কারণ এখানে ZoneOffset.systemDefaultআমি নেই এটি অস্পষ্ট মনে হয়।

import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}

val epochSecond = System.currentTimeMillis() / 1000

LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2

বাল্ক আমদানির import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}কাজ করতে আপনি কোন ভাষা / উপভাষা ব্যবহার করছেন ? এটি একটি এর unexpected tokenজাভা 11. আমার জন্য
anddero

4
স্কেলা হতে পারে তবে এটি এখানে গুরুত্বপূর্ণ নয়
ডোনাতাস এম

4
আমি java.timeএখানে দৈর্ঘ্যের পিছনে তত্ত্বটি নিয়ে আলোচনা করেছি : stackoverflow.com/a/56508200/145989
ওন্দ্রা ndraižka

উত্তর:


113

এখানে আপনি কিভাবে পেতে পারেন ZoneOffsetথেকে ZoneId:

Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);

NB: ZoneIdসময় এবং নির্দিষ্ট জায়গার ইতিহাসের উপর নির্ভর করে আলাদা অফসেট থাকতে পারে। সুতরাং বিভিন্ন ইনস্ট্যান্ট বাছাইয়ের ফলে বিভিন্ন অফসেট তৈরি হবে।

NB2: ZoneId.of()একটি আসতে পারেন ZoneOffsetপরিবর্তে ZoneIdযদি UTC+3/ GMT+2/ ইত্যাদি মত একটি সময় অঞ্চল উল্টোদিকে পাস করা হয়েছে Africa/Cairo। সুতরাং যদি ইউটিসি / জিএমটি অফসেটগুলি পাস হয়ে যায় তবে ofতিহাসিক / ভৌগলিক / দিবালোক সংরক্ষণের তথ্য Instantবিবেচনায় নেওয়া হবে না - আপনি কেবলমাত্র নির্দিষ্ট অফসেট দিয়ে কাজ করবেন work


বর্তমান তাত্ক্ষণিক ডিএসটি
তে

@ এমঞ্জেল, আপনি কি এটি দ্বিগুণ পরীক্ষা করতে পারবেন? হতে পারে আপনি ZoneId.systemDefault()আপনার কোডটি ব্যবহার করছেন এবং এটি বিভিন্ন মেশিনে বিভিন্ন সময় অঞ্চল ফেরত দেয়?
স্ট্যানিস্লাভ বাশকির্তসেভ

আমি এটি যাচাই করেছি এবং এটি অন্য শর্তের উপর নির্ভর করে কাজ করে। সাথে আপডেট উত্তর।
মিসানজেল

43

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

তদ্ব্যতীত, দিবালোক সংরক্ষণের সময় নিয়মগুলি সময়ের সাথে সাথে পরিবর্তিত হতে পারে, সুতরাং জোনাঅফসেট 13/10/1980 এর তুলনায় উদাহরণস্বরূপ ১৩/১০/২০১৫ এর জন্য আলাদা হতে পারে।

সুতরাং আপনি কেবলমাত্র একটি নির্দিষ্ট তাত্ক্ষণিকতায় জোনআইডের জন্য জোনঅফসেটটি সন্ধান করতে পারেন।

Https://en.wikedia.org/wiki/Tz_database দেখুন


10
আমি এটি জানি, তবে এটি কীভাবে করা হয়? যদি আমি লোকাডেটটি জানি এবং একটি জোনআইড থাকে তবে আমি কীভাবে এটি একটি জোনঅফसेटে রূপান্তর করব। আমার ইউজ-কেস একটি স্ট্রিং যা একটি সময় এবং একটি জোন ধারণ করে। আমি জোনটির তথ্য বাদ না দিয়ে স্ট্রিংটিকে একটি অফসেটটাইমে পার্স করতে চাই।
কাই মরিটজ

35

tl; ডা

ZonedDateTime.now( 
    ZoneId.of( "America/Montreal" ) 
)

... বর্তমান ডিফল্ট সময় অঞ্চল…

ZonedDateTime.now( 
    ZoneId.systemDefault() 
)

বিশদ

স্তানিস্লাভ Bshkyrtsev দ্বারা উত্তর সঠিকভাবে এবং সরাসরি আপনার প্রশ্নের উত্তর।

তবে, জেন স্কিটের উত্তরটিতে প্রস্তাবিত হিসাবে বৃহত্তর সমস্যাগুলি জড়িত রয়েছে ।

LocalDateTime

দ্বিতীয় যুগের লোকালডেটটাইমে রূপান্তর করার উপায় আমি খুঁজে পাই না

LocalDateTimeউদ্দেশ্যমূলকভাবে সময় অঞ্চল বা অফসেট থেকে ইউটিসি সম্পর্কিত কোনও ধারণা নেই। সম্ভবত আপনি কি চান না। Local…মানে কোন স্থান, কোন একটি বিশেষ অঞ্চল। এই শ্রেণীর করে না এক মুহূর্তের মাত্র প্রতিনিধিত্ব সম্ভাব্য 26-27 সম্পর্কে ঘন্টা (সময় অঞ্চল পরিসীমা প্রায় সারা বিশ্ব) একটি সীমার বরাবর মুহূর্ত।

Instant

আপনি যদি বর্তমান সময়টি পেতে চাইছেন তবে যুগের সেকেন্ড দিয়ে শুরু করার দরকার নেই। বর্তমান পান InstantInstantক্লাসে টাইমলাইনে একটি মুহূর্ত প্রতিনিধিত্ব করে ইউটিসি একটি রেজোলিউশনে ন্যানোসেকেন্ড (একসঙ্গে নয় জন (9) একটি দশমিক ভগ্নাংশের সংখ্যায় পর্যবসিত)।

Instant instant = Instant.now();

যে এর ভিতর Instantএকটি গণনা হয় ন্যানোসেকেন্ড -from-কাল। কিন্তু আমরা সত্যিই যত্ন নেই।

ZonedDateTime

যদি আপনি কোনও নির্দিষ্ট অঞ্চলের প্রাচীর-ঘড়ির সময় লেন্সের মধ্য দিয়ে সেই মুহূর্তটি দেখতে চান তবে একটি ZoneIdপেতে একটি প্রয়োগ করুন ZonedDateTime

ZoneId z = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = instant.atZone( z );

একটি শর্টকাট হিসাবে, আপনি সরাসরি করতে পারেন ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.now( z );  

ZonedDateTimeএর Instantমধ্যে একটি রয়েছে । ইউটিসিতেzdt.toInstant() একটি মৌলিক মান হিসাবে একই মুহূর্তটি পেতে কল করুন । ন্যানোসেকেন্ডের একই সংখ্যা - যেহেতু কোনওভাবেই হয়, হিসাবে বা একটি হিসাবে ।ZonedDateTimeInstant

দ্বিতীয় যুগের পর থেকে দেওয়া হয়েছে ch

যদি আপনাকে যুগের পর থেকে কয়েক সেকেন্ডের একটি গণনা দেওয়া হয় এবং ইউটিসি ( 1970-01-01T00:00:00Z) -তে 1970 এর প্রথম মুহূর্তটি হয় , তবে সেই সংখ্যাটি ফিড করুন Instant

long secondsSinceEpoch = 1_484_063_246L ;
Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;

জাভাতে আধুনিক এবং উত্তরাধিকার উভয়ই তারিখের সময়ের ধরণের সারণী।


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

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

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

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

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

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

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


10

ডকুমেন্টেশন যেমন বলে, "এটি প্রাথমিকভাবে সাধারণ প্রয়োগের পরিবর্তে নিম্ন-স্তরের রূপান্তরগুলির জন্য।

এর মধ্য দিয়ে যাওয়া Instantআমার কাছে সঠিক ধারণা দেয় - আপনার দ্বিতীয় যুগটি কার্যকরভাবে একটির একটি আলাদা উপস্থাপনা Instant, সুতরাং একটিতে রূপান্তর করুন Instantএবং তারপরে এটিকে একটি নির্দিষ্ট সময় অঞ্চলে রূপান্তর করুন।


9

আমি আশা করি নীচে আমার সমাধানের প্রথম দুটি লাইন সহায়ক হবে। আমার সমস্যাটি ছিল আমার একটি LocalDateTimeএবং একটি টাইম জোনের নাম, এবং আমার একটি প্রয়োজন instantযাতে আমি একটি তৈরি করতে পারি java.util.Date, কারণ এটি মঙ্গোডিবি চেয়েছিল। আমার কোডটি স্কালা, তবে এটি জাভার খুব কাছাকাছি এখানে আমি মনে করি এটি বুঝতে কোনও সমস্যা হওয়া উচিত নয়:

val zid = ZoneId.of(tzName)                                // "America/Los_Angeles"
val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00
                                         // 2017-03-16T18:03

val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00
val instant = odt.toInstant                    // ⇒ 2017-03-17T01:03:00Z
val issued = Date.from(instant)

4
আমি এই উত্তরটি এখানে পোস্ট করেছি কারণ এই পৃষ্ঠাটি তখনই উঠে এসেছিল যখন আমি অবশেষে সন্ধান করি যা করার উপায় অনুসন্ধান করছিলাম।
gknauth

2

এই সময় অঞ্চলে স্ট্যান্ডার্ড সময় পাওয়ার জন্য নিম্নলিখিতটি ইউটিসিতে যোগ করতে মিলিসেকেন্ডে সময় পরিমাণ ফেরত দেয়:

TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()

0

আমার এক যুগ দ্বিতীয় এবং একটি জোনআইডি রয়েছে। জাভা 8-এ জোনআইডকে জোনঅফসেটে রূপান্তর করার কোনও উপায় আছে কি?

  1. ZonedDateTimeদ্বিতীয় যুগ এবং অঞ্চল আইডি থেকে পান Get
  2. পান ZoneOffsetথেকেZonedDateTime

ডেমো:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // Get ZonedDateTime from epoch second and Zone Id
        ZonedDateTime zdt = Instant.ofEpochSecond(1597615462L).atZone(ZoneId.of("Europe/London"));

        // Get ZoneOffset from ZonedDateTime
        ZoneOffset offset = zdt.getOffset();

        System.out.println(offset);
    }
}

আউটপুট:

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