জাভাতে “ইউনিক্সটাইম” পাচ্ছেন


258

ডেট.জেটটাইম () জানুয়ারী 1, 1970 থেকে মিলিসেকেন্ডগুলি ফেরত দেয় Un ইউনিক্সটাইম 1 জানুয়ারি, 1970 এর পরে সেকেন্ড হয়। আমি সাধারণত জাভাতে কোড করি না, তবে আমি কিছু বাগ ফিক্স নিয়ে কাজ করছি। আমার আছে:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

জাভাতে ইউনিক্সটাইম পাওয়ার আরও কি ভাল উপায় আছে?


27
যেহেতু আপনি এটিকে কোনও আন্তঃ কাস্ট করেছেন, আপনি ২০৩৮ সালের সমস্যাটি (ইউনিক্সের জন্য ওয়াই টিকে সমতুল্য) প্রবর্তন করেছেন। ইউনিক্সের যুগে 2 বিলিয়ন আঘাত আসে এবং নেতিবাচক হয়ে যায় That's ফিক্সটি 64৪-বিট ইউনিক্সে স্থানান্তরিত করতে হবে। জাভা সমতুল্য এটি দীর্ঘ হিসাবে ছেড়ে যেতে হয়।
জন এম

1
হ্যাঁ, আমি এটি সম্পর্কে সচেতন। কোডটি এটির সাথে ইন্টারফেস করছে এটি ইউনিক্সটাইমের জন্য 32 বিট ইনট আশা করে।
গ্যারি রিচার্ডসন

157
2038 শীঘ্রই আসছে।
পেসারিয়ার

কারেন্টটাইমমিলিসের জন্য কি কোনও সঠিক নাম বা মান আছে? আমি আমার ডকুমেন্টেশনে এটি ইউনিক্স সময়ের মিলিসেকেন্ড সংস্করণ হিসাবে উল্লেখ করি।
টম

1
আপনি যদি চান তবে আপনার সফ্টওয়্যার ওভারফ্লোতে বেঁচে থাকবে, ব্যবহার করুন longনা intintটাইমস্ট্যাম্পের জন্য সত্যই ব্যবহার করার কোনও কারণ নেই , যদি না আপনি 1 সেকেন্ড = 4 সেকেন্ড ইত্যাদির মতো আলাদা গ্রানুলারিটি ব্যবহার করেন তবে তা হয় না, বা আপনার কোডটি লুকিয়ে রাখেন যাতে ভবিষ্যতে প্রজন্মরা দেখতে না পারে যে আপনি কতটা অক্ষম।
bryc

উত্তর:


475

ডেট অবজেক্ট তৈরি ডাব্লু / সিস্টেম.কন্ট্রেনটাইমমিলিস () এড়িয়ে চলুন । 1000 দ্বারা বিভাজন আপনাকে ইউনিক্সের যুগে যায়।

একটি মন্তব্যে উল্লিখিত হিসাবে, আপনি ইউনিক্সটাইম ভেরিয়েবলের ধরণের জন্য সাধারণত একটি আদিম দীর্ঘ (লোয়ার-কেস-এল লং) কোনও বক্সযুক্ত অবজেক্ট (মূলধন-ল লং) চান না।

long unixTime = System.currentTimeMillis() / 1000L;

3
লং-এ অটোবক্সিংয়ের পরিবর্তে আদিম দীর্ঘ ব্যবহারের কথা বিবেচনা করুন, যদি না আপনি অবজেক্ট হিসাবে নম্বরটি পরিচালনা করতে চান (যেমন এটি কোনও সংগ্রহের মধ্যে রাখে), আবার অপ্রয়োজনীয় অবজেক্ট তৈরি করা এড়িয়ে
চলেন

9
জাভা 32-বিট ইন্ট 32-বিট প্ল্যাটফর্মগুলির সাথে মেলে (এবং বছর 2038 সমস্যা)। -৪-বিট প্ল্যাটফর্মগুলি একটি বৃহত্তর টাইম_t ডেটা টাইপ ব্যবহার করে। জাভা সেই বুলেটটিকে ডডড করে দীর্ঘ সময় ব্যবহার করে সিস্টেম.কোর্নটাইমমিলিস () ব্যবহার করে। আপনি যদি ইনট এ রূপান্তর করেন তবে আপনি ২০৩৮ সালের সমস্যাটি আবার চালু করছেন। En.wikedia.org/wiki/Year_2038_ সমস্যা # সমাধান
জন এম

1
আমি মনে করি আপনি একটি বিন্দুতে ভুল হয়ে গেছেন: এই জাতীয় সংখ্যায় অক্ষরে অক্ষরে অক্ষর ব্যবহার করার সময় লোয়ার কেস "এল" এবং উপরের ক্ষেত্রে কোনও পার্থক্য নেই is docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
ম্যাট

5
মূলধন আলোচনার (উপরে বর্ণিত) তথ্য প্রকার সম্পর্কে ছিল। আদিম "দীর্ঘ" বনাম "java.lang.Long" শ্রেণীর উদাহরণ। আপনি দীর্ঘ আক্ষরিক উপরের প্রত্যয়টি সম্পর্কে কথা বলছেন, যা আমি সম্মত তা আপার বা লোয়ার কেস হতে পারে। যদিও লোয়ার কেস "এল" হ'ল ডিজিটের "1" এর মতো অনেক কিছু দেখায় তাই মূলধন "এল" ব্যবহার করা আরও অনেক বেশি পঠনযোগ্য।
জন এম

1
ডকুমেন্টেশনের লিঙ্কটি ক্লিক করুন। ইউটিসি টাইমজোনটিতে 1/1/1970 থেকে রিটার্নটি মিলিসেকেন্ডের সংখ্যা হিসাবে সংজ্ঞায়িত করা হয়েছে। আপনি টাইমজোন চান? জাভা.ইটিল.ক্যালেন্ডারটি দেখুন।
জন এম

272

জাভা 8 তারিখ এবং সময় নিয়ে কাজ করার জন্য একটি নতুন এপিআই যুক্ত করেছে। জাভা 8 এর সাথে আপনি ব্যবহার করতে পারেন

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()একটি তাত্ক্ষণিক ফেরত দেয় যা বর্তমান সিস্টেম সময়কে উপস্থাপন করে। getEpochSecond()আপনি এর সাথে যুগের সেকেন্ড (ইউনিক্স সময়) পান Instant


4
কি মধ্যে পার্থক্য Instant.now().getEpochSecond(), new Date().getTime()এবংSystem.currentTimeMillis()
SohamC

2
একটি পার্থক্য হ'ল পূর্ববর্তীটি সেকেন্ডে হয় এবং দ্বিতীয়টি মিলিসেকেন্ডে থাকে। অন্য থাকতে পারে বা নাও থাকতে পারে।
super_aardvark

3
import java.time.Instantআপনি যদি স্কালায় থাকেন
akauppi

4
বিস্তারিত বিবরণ জন্য ভাল হিসাবে এই সাইটের চেক করুন ... পছন্দ করা এটা .. currentTimeMillis
সুব্রত

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