কেন জাভা 8 জাভা.টাইম ক্লাসগুলি একটি getMillis () পদ্ধতি অনুপস্থিত?


64

জাভা 8 এর প্যাকেজ জাভা.টাইমে খেজুর এবং সময়গুলির জন্য একটি সম্পূর্ণ নতুন লাইব্রেরি রয়েছে যা যোডাটাইম ব্যবহার করার আগে বা তার নিজস্ব তারিখ প্রক্রিয়াকরণ সহায়ক পদ্ধতি তৈরির ক্ষেত্রে ঝামেলা পোহাতে পারে এমন যে কেউ তার পক্ষে খুব স্বাগত। এই প্যাকেজের অনেক ক্লাস টাইমস্ট্যাম্পগুলি উপস্থাপন করে এবং সহায়ক পদ্ধতিগুলি যেমন getHour()টাইমস্ট্যাম্প থেকে ঘন্টা পাওয়া, টাইমস্ট্যাম্প থেকে কয়েক getMinute()মিনিট সময় পাওয়া, getNano()টাইমস্ট্যাম্প থেকে ন্যানো পেতে ইত্যাদি ...

আমি লক্ষ্য করেছি যে তাদের getMillis()কাছে টাইম স্ট্যাম্পের মিলিস পাওয়ার জন্য কল করা কোনও পদ্ধতি নেই । পরিবর্তে এক কল করতে হবে পদ্ধতি get(ChronoField.MILLI_OF_SECOND)। আমার কাছে এটি লাইব্রেরিতে অসঙ্গতির মতো বলে মনে হচ্ছে। কেউ কি জানেন যে এই জাতীয় পদ্ধতিটি কেন অনুপস্থিত, বা জাভা 8 এখনও বিকাশে রয়েছে, এটি পরে যুক্ত হওয়ার সম্ভাবনা রয়েছে কি?

https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

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

প্রতিটি তারিখের সময় উদাহরণগুলি এমন ক্ষেত্রগুলি দিয়ে গঠিত যা এপিআই দ্বারা সুবিধামত উপলব্ধ করা হয়। ক্ষেত্রগুলিতে নিম্ন স্তরের অ্যাক্সেসের জন্য java.time.temporalপ্যাকেজটি দেখুন। প্রতিটি ক্লাসে মুদ্রণ এবং তারিখ এবং সময় সমস্ত ধরণের পার্সিং জন্য সমর্থন অন্তর্ভুক্ত। পড়ুন java.time.formatস্বনির্ধারণ অপশন জন্য প্যাকেজ ...

এই ধরণের শ্রেণির উদাহরণ:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

আইএসও -8601 ক্যালেন্ডার সিস্টেমে টাইম-জোন ছাড়াই একটি তারিখ-সময়, যেমন 2007-12-03T10: 15: 30।

LocalDateTimeএকটি অপরিবর্তনীয় তারিখ-সময় অবজেক্ট যা একটি তারিখ-সময়কে প্রতিনিধিত্ব করে, প্রায়শই বছর-মাস-দিন-ঘন্টা-মিনিট-সেকেন্ড হিসাবে দেখা হয়। বছরের অন্যান্য দিন, সপ্তাহের দিন এবং সপ্তাহের-বছরের মতো অন্যান্য তারিখ এবং সময় ক্ষেত্রগুলিও অ্যাক্সেস করা যায়। সময় ন্যানোসেকেন্ড যথার্থতার প্রতিনিধিত্ব করে। উদাহরণস্বরূপ, "2 শে অক্টোবর 2007 এ 13: 45.30.123456789" এর মানটি একটিতে সংরক্ষণ করা যেতে পারে LocalDateTime...


দেখে মনে হচ্ছে যেন তারা get()ব্যক্তিগত, অনন্য নাম দেওয়ার পরিবর্তে প্রচলিত পদ্ধতিগুলির একগুচ্ছ সমাধানের জন্য বহুবিজ্ঞান ব্যবহার করতে চায় । এটি যদি আপনাকে বিরক্ত করে, এমন একটি ক্লাস লিখুন যা মূল শ্রেণীর উত্তরাধিকার সূত্রে আসে এবং নিজের getMillis()পদ্ধতিটি নতুন শ্রেণিতে রাখে।
রবার্ট হার্ভে

@ রবার্টহারভে জাভা.টাইম প্যাকেজের বেশিরভাগ ক্লাস অপরিবর্তনীয় এবং এগুলি বাড়ানো যায় না।
Assylias

2
@ রবার্টহারভে আমার কাছে প্রশ্নটি নয় যে আমি কীভাবে এটি সমাধান করতে পারি। এটি কেবল একটি অদ্ভুত অসঙ্গতি দেখায় এবং আমি ভাবলাম যে এর কোনও আকর্ষণীয় ব্যাখ্যা আছে কিনা।
টারমো

আমার ধারণা রয়েছে যে কিছু আর্কিটেকচার / ওএস নির্ভরযোগ্যভাবে মিলিসেকেন্ড সমর্থন করে না। অন্য কথায়, সিস্টেম সময়টি কেবলমাত্র মিলি সেকেন্ডে, কেবলমাত্র সেন্টিগ্রেড বা সিদ্ধান্তের দিকে পুনরুদ্ধার করা যায় না।
মার্কো

দেখুন stackoverflow.com/a/23945792/40064 একটি পথে মাধ্যমে এটা করতে Instantবর্গ
Wim Deblauwe

উত্তর:


63

জেএসআর -310 ন্যানোসেকেন্ডের উপর ভিত্তি করে, মিলিসেকেন্ডে নয়। যেমন, বুদ্ধিমান পদ্ধতির ন্যূনতম সেটটি ঘন্টা, মিনিট, দ্বিতীয় এবং ন্যানোসেকেন্ডের উপর ভিত্তি করে। ন্যানোসেকেন্ড বেস রাখার সিদ্ধান্তটি এই প্রকল্পের মূল সিদ্ধান্তগুলির মধ্যে একটি এবং আমি দৃ strongly়ভাবে বিশ্বাস করি যে এটি সঠিক।

মিলিসের জন্য একটি পদ্ধতি যুক্ত করা ন্যানোসেকেন্ডের সাথে ওভারল্যাপ হবে। উদাহরণস্বরূপ ন্যানো ক্ষেত্রটি ন্যানো-অফ-সেকেন্ড বা ন্যানো-অফ-মিলি ছিল কিনা তা ব্যবহারকারীদের ভাবতে হবে। একটি বিভ্রান্তিকর অতিরিক্ত পদ্ধতি যুক্ত করা বাঞ্ছনীয় নয়, সুতরাং পদ্ধতিটি বাদ দেওয়া হয়েছিল। হিসাবে নির্দেশিত, বিকল্প get(MILLI_OF_SECOND)উপলব্ধ।

এফডাব্লুআইডাব্লু, আমি getMillis()ভবিষ্যতে পদ্ধতিটি যুক্ত করার বিরোধিতা করব ।


1
আমি এই প্রশ্নের কয়েকটি খুব ভাল উত্তর পেয়েছি তবে আপনার উত্তরটি আমার পছন্দের কারণ এটি সংক্ষিপ্ত এবং তবুও এটি এখনও খুব ভাল পয়েন্ট দেয় এবং সত্যই আমাকে এই পদ্ধতির প্রয়োজনীয়তার সাথে দৃin়প্রত্যয় জানায়। ধন্যবাদ.
টারমো

12
@ s3ib আপনি যদি উত্তরদাতার প্রোফাইল পরীক্ষা করেন তবে আপনি দেখতে পাবেন যে আপনি যে API এর বিষয়ে জিজ্ঞাসা করছেন তার জন্য তিনি একটি স্পেসিফিকেশন সীসা । এটি একটি উত্তর হিসাবে প্রামাণিক হিসাবে এটি পায় না তোলে তোলে :)
gnat

সুতরাং করণীয় instant.getEpochSecond * 1000 + instant.getNano / 1000000কি যুক্তিযুক্ত বয়লারপ্লেট উত্তরাধিকারের সাথে যোগাযোগ করতে সক্ষম হবেন (এই মুহুর্তে, সমস্ত) জাভা এপিআই, জাভাস্ক্রিপ্ট ইত্যাদি?
নীলস্কেপ

10
না, সেই ক্ষেত্রে আপনি শুধু instant.toEpochMilli () ব্যবহার করতে পারেন download.java.net/jdk8/docs/api/java/time/...
JodaStephen

20

ওপেনজেডিকে অংশ নেওয়ার আগে থ্রিটেন গিথুবে ছিলেন এবং তার আগে এটি সোর্সফোরে ছিল। তারপরে, স্টিফেন কোলবর্ন, যিনি জেএসআর -310-এ স্পেসিফিকেশন সীসা, তিনি একটি সমীক্ষা করেছিলেন যাতে আপনি এখনও সোর্সফোজের সাইটে খুঁজে পেতে পারেন ।

The fourth question on the survey covered the method names for LocalTime:
1) getHourOfDay(), getMinuteOfHour(), getSecondOfMinute(), getNanoOfSecond()
2) getHour(), getMinute(), getSecond(), getNanoOfSecond()
3) getHour(), getMinute(), getSecond(), getNano()
4) another idea

মাত্র .2.২৩% উত্তর # 4 বেছে নিয়েছে এবং তাদের মধ্যে প্রায় 15% একটি জিজ্ঞাসা করেছে getMillis(), মোট ভোটের 1% এরও কম।

সম্ভবত এই কারণেই সেখানে প্রথম কোনও getMillisজায়গা ছিল না এবং আমি ওপেনজ্যাডকের মেলিং তালিকার সাথে সম্পর্কিত কোনও কিছুই খুঁজে পাইনি সুতরাং পরে বিষয়টি স্পষ্টতই আলোচিত হয়নি।


3
আমি মনে করি যে লোকদের বেশ কয়েকটি পছন্দ দেওয়ার ফলে তাদের আদর্শ পছন্দটি "অন্য" এর অধীনে থাকা সত্ত্বেও তারা সেই পছন্দগুলির মধ্যে একটি বেছে নেওয়ার সম্ভাবনা বাড়িয়ে তোলে। যদিও আমি ভুল হতে পারি।
অ্যালন গুরালেক

2
@ অ্যালোনগুরালেনেক হ্যাঁ অবশ্যই - তবে ডেট এপিআইতে মিলিসেকেন্ড উপাদানটি গুরুত্বপূর্ণ ছিল কারণ সমস্ত কিছু যুগের আগে থেকেই বেশ কয়েকটি মিলির উপর ভিত্তি করে ছিল। নতুন এপিআইতে এটি কম প্রাসঙ্গিক IMO is বেশিরভাগ ব্যবহারের ক্ষেত্রে, আপনার হয় দ্বিতীয় স্পষ্টতা বা সর্বোত্তম নির্ভুলতা উপলব্ধ (ন্যানোস)। আমার ভুল হতে পারে.
Assylias

1
এটি পদ্ধতিগুলির নামকরণ সম্পর্কে জিজ্ঞাসা করে বলে মনে হচ্ছে , কোন পদ্ধতিগুলির অস্তিত্ব থাকা উচিত নয়।
সুইভ

1
ঠিক আছে, দুঃখিত, আমি পরিষ্কার ছিলাম না: আমি জরিপ থেকে প্রশ্নটি বোঝাতে চাইছিলাম, এটি সরাসরি এই প্রশ্নের সাথে সম্পর্কিত নয়।
সুইভ

15

যে ক্লাসগুলি দ্ব্যর্থহীন ইউটিসি সময়ের প্রতিনিধিত্ব করে (সেগুলি তাত্ক্ষণিক, অফসেটডেটটাইম, জোনেডেটটাইম) জাভা ইউপুচ থেকে পরম অফসেট অ্যাক্সেস করার জন্য দুটি সহায়ক সহায়ক পদ্ধতি রয়েছে, যাকে আপনি java.util.Date- এ 'মিলিসেকেন্ড সময়' বলছেন, যা আপনি ব্যবহার করতে পারেন মিলিসেকেন্ডে পেতে

long getEpochSecond()
int getNano()

1000L*getEpochSecond() + getNano() / 1000000L;

এর পরিবর্তে কেন এটি বেছে নেওয়া হয়েছে তার কয়েকটি কারণ জেএসআর 310 মেলিং তালিকায়long getEpochMillis() আলোচিত হয়েছিল , যার মধ্যে কয়েকটি সুবিধার্থে আমি এনেছি:

মনে করা যুক্তিসঙ্গত বলে মনে হয় যে মিলি সেকেন্ডের যথার্থতা যথেষ্ট হবে না। তবে ন্যানোসেকেন্ডের নির্ভুলতার চেয়ে বৃহত্তর কিছু অতিরিক্ত বলে মনে হচ্ছে

...

এটি বাস্তবায়নের জন্য, আমার পছন্দসই বিকল্পটি হবে bit৪ বিট দীর্ঘ সেকেন্ড (স্বাক্ষরিত) + ৩২ বিট ইন্ট ন্যানোসেকেন্ডস (স্বাক্ষরযুক্ত)।

...

আমি বিভক্তিকে দ্বিতীয় স্তরে থাকতে পছন্দ করি কারণ এটি বিজ্ঞানের সময়ের অফিশিয়াল এসআই ইউনিট, এবং সর্বজনীনভাবে সম্মত মান।

দিন স্তরে বিভক্ত হওয়া তাত্ক্ষণিকভাবে সমস্যাযুক্ত কারণ এটি লিপ সেকেন্ড হ্যান্ডেল করে না। মিলি সেকেন্ডের স্তরে বিভক্ত হওয়া, জাভার বাকী অংশগুলির সাথে কিছুটা ভাল সংহত করার সময়, সত্যিই অদ্ভুত বলে মনে হচ্ছে। প্লাস এটি সমর্থিত পরিসরে হারায়।

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

আমার অনুভূতি আছে যে অন্য কারণটি ছিল ইচ্ছাকৃতভাবে java.util.Date থেকে JSR310 ক্লাসে রূপান্তর করা কঠিন, এই আশায় যে বিকাশকারীরা কেবল অন্ধভাবে (ভুল) নতুন ক্লাস ব্যবহার না করে বিভিন্ন বিকল্পের মধ্যে পার্থক্য বোঝার চেষ্টা করবেন।

LocalDateTimeশ্রেণীর কেন এই পদ্ধতিগুলি নেই - এগুলি সম্ভবত সেখানে উপস্থিত থাকতে পারে না কারণ LocalDateTimeআপনি কোন জোনটিতে রয়েছেন বা আপনার ইউটিসি অফসেট কী তা স্থির না করা পর্যন্ত আপনি ইউটিসি টাইমলাইনের সাথে বেঁধে নেই, কোন মুহুর্তে আপনি নিজেই একটি OffsetDateTimeবা ZonedDateTime(যার দুটিতেই প্রয়োজনীয় পদ্ধতি রয়েছে)।

বিকল্পভাবে, আপনি নিজের LOCAL_EPOCHধ্রুবকের নিজস্ব সংজ্ঞা দিতে পারেন 1970-01-01T00:00:00এবং তারপরে MILLIS.between(LOCAL_EPOCH, localTime)মিলিসেকেন্ডে কিছু সময়ের জন্য নির্দিষ্ট সময় নিতে পারেন। এই মান অবশ্য দ্বারা ফিরে কোনো মান সঙ্গে সামঞ্জস্যপূর্ণ হবে না System.currentTimeMilliseconds()বা java.util.Date.getTime(), যদি না অবশ্যই আপনি ইউটিসি সময় হতে আপনার স্থানীয় সময় নির্ধারণ; তবে এক্ষেত্রে আপনি সরাসরি ইনস্ট্যান্ট বা জোনাঅফসেট.আউটসির সাথে অফসেটডেটটাইম ব্যবহার করতে পারেন।


4
" তারা সম্ভবত সেখানে থাকতে পারে না কারণ লোকালডেটটাইমটি ইউটিসি টাইমলাইনের সাথে আবদ্ধ নয় " => একটি লোকালডেটটাইমে অবশ্যই একটি getMillisপদ্ধতি থাকতে পারে যা মূলত ফিরে আসবে getNanos()/1e6- সত্য যে এটি সময়ে তাত্ক্ষণিক নয় এটি মিলসেকেন্ডে আটকায় না উপাদান.
Assylias

2
" আমার অনুভূতি আছে যে আর একটি কারণ ছিল ইচ্ছাকৃতভাবে java.util.Date থেকে JSR310 ক্লাসে রূপান্তর করা কঠিন হয়ে গেছে " সম্ভবত সত্য, তবে দুর্ভাগ্যক্রমে "মিলিস যুগের পর" সময়ের প্রায় সর্বজনীন প্রতিনিধিত্ব হয়ে গেছে, তাই যে কোনও কিছুর জন্য প্রয়োজন পুরানো জাভা এপিআই, জাভাস্ক্রিপ্ট, অন্য যে কোনও কিছুর সাথে যোগাযোগ করতে, এই বাদ দেওয়া সত্যিকারের ঝামেলা।
নীলস্কেপ

শীর্ষে আপনার কোড স্নিপেটটি ভুল - আপনাকে getEpochSecond 1000 দ্বারা গুণতে হবে
টিন ম্যান

@nilskp তারা দুটি ভিন্ন জিনিস। getMillis()গেম মিলিস-সেকেন্ডের মতো প্রশ্ন করা হচ্ছে ; আপনি "যুগ যুগ থেকে মিলিস" সম্পর্কে কথা বলছেন। গ্রহণযোগ্য উত্তরে বর্ণিত হিসাবে প্রাক্তন অনুপস্থিত। পরেরটি ইতিমধ্যে হিসাবে উপলব্ধ Instant.toEpochMillis()। সুতরাং, LocalDateTimeldt.toInstant(offset).toEpochMillis()
একটির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.