জাভা 8 এর লোকালডেটটাইম থেকে কীভাবে মিলিসেকেন্ডগুলি পাবেন


285

যদি সেখানে যেহেতু 1-1-1970 (সময় পর্ব) বর্তমান মিলিসেকেন্ড পেতে একটি উপায় নতুন ব্যবহার করছে আমি অবাক হচ্ছি LocalDate, LocalTimeবা LocalDateTimeজাভা 8 ক্লাস।

জানা উপায় নীচে:

long currentMilliseconds = new Date().getTime();

অথবা

long currentMilliseconds = System.currentTimeMillis();

6
এর সাথে কী হয়েছে System.currentTimeMillis()?
দাউদ ইবনে কেরেম

16
@ ডেভিডওয়ালেস তিনি এখনকার সময় নয়, একটি তারিখের সময় পাওয়ার চেষ্টা করছেন?
আনুবিয়ান নুব

2
"... বর্তমান মিলি সেকেন্ডগুলি পাওয়ার একটি উপায় ..."
দাউদ ইবনে কেরেম

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

1
এই শ্রেণীর জন্য আমার উদ্দেশ্যটি হল এটি সময়ের "মানব-কেন্দ্রিক" বোঝা currentTimeMillisএবং সেই প্রসঙ্গে অপ্রাসঙ্গিক হবে। সত্যিই ভাল নির্ভুলতার সাথে ক্যালেন্ডার + ওয়াল-ক্লকটি ভাবেন এবং সময় অঞ্চল এবং লোকাল সম্পর্কে কোনও উদ্বেগ নেই। সুতরাং কোনও লোকালটাইম থেকে "ইউটিসি সময়" এ ফিরে আসার কোনও উপায় নেই
গাস

উত্তর:


325

আপনি "বর্তমান মিলি সেকেন্ড" বলতে কী বোঝায় তা সম্পূর্ণরূপে নিশ্চিত নই তবে আমি ধরে নেব এটি "যুগের" পরে, 1 জানুয়ারী 1, 1970 ইউটিসি-র মধ্যরাত্রি থেকে মিলসেকেন্ডের সংখ্যা।

আপনি যদি এই মুহুর্ত থেকে এখন থেকে মিলিসেকেন্ডের সংখ্যাটি খুঁজে পেতে চান , তবে অনুবিয়ান নুব নির্দেশ করেছেনSystem.currentTimeMillis() হিসাবে ব্যবহার করুন । যদি তা হয় তবে নতুন জাভা.টাইম এপিআই এর কোনও ব্যবহার করার কারণ নেই।

তবে, সম্ভবত আপনার LocalDateTimeকোথাও কোথাও থেকে ইতিমধ্যে একটি বা অনুরূপ অবজেক্ট রয়েছে এবং আপনি এটিকে পর্বের সময় থেকেই এটি মিলিসেকেন্ডে রূপান্তর করতে চান। এটি সরাসরি করা সম্ভব নয়, যেহেতু LocalDateTimeঅবজেক্টের পরিবারটি কোন টাইম জোনে রয়েছে সে সম্পর্কে কোনও ধারণা নেই time সুতরাং সময় অঞ্চলের তথ্যটি ইউটিসিতে থাকা যুগের সাথে সম্পর্কিত সময় খুঁজে পেতে সরবরাহ করা প্রয়োজন।

ধরুন আপনার LocalDateTimeমতো একটি রয়েছে :

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

আপনাকে সময় অঞ্চল তথ্য প্রয়োগ করতে হবে, একটি ZonedDateTime। আমি লস অ্যাঞ্জেলেসের একই সময় অঞ্চলে আছি, তাই আমি এই জাতীয় কিছু করব:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

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

যাইহোক, আপনি যদি কোনও বৈধ পেতে পারেন তবে আপনি ZonedDateTimeএটিকে যুগের পর থেকে মিলিসেকেন্ডের সংখ্যায় রূপান্তর করতে পারেন, এর মতো:

long millis = zdt.toInstant().toEpochMilli();

5
মনে রাখবেন যে, ZonedDateTime ইতিমধ্যে হয়েছেgetEpochSecond পদ্ধতি (মাধ্যমে ChronoZonedDateTime ডিফল্ট )। কোন প্রয়োজন নেই Instant
মাবি

13
অবশ্যই, আপনার যদি প্রয়োজন হয় সেকেন্ড, মিলিসেকেন্ড নয়।
স্টুয়ার্ট

1
ভাল আহ, আমি যথাযথ নয় এমন ছিল: ZonedDateTimeএছাড়াও আছে Instantগণ getNanoপদ্ধতি, তাই আপনি শুধু প্রতিস্থাপন করতে পারবেন না instসঙ্গে zdtআপনার উদাহরণে?
মাবি

18
Zdt.get (ক্রোনোফিল্ড.মিল্লিআমআল_সেকেন্ড) ব্যবহার করে ন্যানোসের গণিতগুলি এড়িয়ে চলুন। Zdt.toInstant () .EpechMilli ()
জোদাস্টেফেন

2
@PerLundberg আমি শুধু তুলনা ZonedDateTime.now().toInstant().toEpochMilli(), LocalDateTime.now().toInstant(OffsetDateTime.now().getOffset()).toEpochMilli(), LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli(), Calendar.getInstance().getTime().getTime(), new Date().getTime()এবং System.currentTimeMillis()। আপনার প্রস্তাবিত একমাত্র পদ্ধতিটি "অফ" বলে মনে হচ্ছে: LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()এটি আপনাকে আপনার স্থানীয় তারিখের জন্য মিলিস দেয় যেমন এটি একটি ইউটিসি তারিখ , অর্থাৎ যদি স্থানীয় তারিখটি ইউটিসি +২ হয় তবে আপনার পদ্ধতিটি ভবিষ্যতে ২ ঘন্টা জন্য মিলিস দেয়
ওয়ালেন

81

আমি কী করি তাই আমি সময় অঞ্চল নির্দিষ্ট করে না,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

দেয়

ldt 1424812121078 
ctm 1424812121281

আপনি দেখতে পাচ্ছেন যে একটি ছোট এক্সিকিউশন সময় বাদে সংখ্যাগুলি একই are

আপনি যদি সিস্টেম.কন্ট্রেনটাইমমিলিস পছন্দ করেন না, তবে ব্যবহার করুন Instant.now().toEpochMilli()


3
না, এপোকটি ইউটিসির সাথে সম্পর্কিত তবে আপনি আপনার স্থানীয় অঞ্চল থেকে বর্তমান সময়টি পান।
রাফেল মেমব্রাইব

2
@ ক্রিস্টোফারহ্যামারস্ট্রিম যুগের পর থেকে যে পরিমাণ মিলি সেকেন্ড পেরিয়ে গেছে তা টাইমজোন থেকে আলাদা একটি সত্য fact এটি মিলি সেকেন্ডের সমান পরিমাণ, কোনও দিন আপনি এটি কল করেন না কেন। দুটি ফলাফল ভিন্ন কারণ ব্রায়ানের মেশিনটি দ্বিতীয় কমান্ডটি কার্যকর করতে 203 মিলিসেকেন্ড নিয়েছিল।
ফ্লেচ

ইউটিসি ব্যবহার করা ঠিক কি যখন ব্যবহারকারীর কোনও ভিন্ন টাইমজোন হয়
গিলবার্টস

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

20

জোনআইড এড়ানোর জন্য আপনি এটি করতে পারেন:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

মান হিসাবে 0 পাচ্ছেন, ঠিক!


8
ZoneOffset.ofTotalSeconds(0)এটি একইZoneOffset.UTC
এন্টন নোভাপাশিন

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

আমার প্রথম মন্তব্যটি কিছুটা কঠোর ছিল, তবে তা আপত্তিজনক হিসাবে বোঝানো হয়নি। আপনি অপরাধ করেছেন। আমি দুঃখিত. আমি এটি মুছে ফেলেছি। আমাকে অন্য উপায়ে জিজ্ঞাসা করার অনুমতি দিন: আমাদের এড়াতে চাওয়ার কারণ কী হতে পারে ZoneId?
ওলে ভিভি

@ ওলেভ.ভি ইউটিসি ব্যবহার করা ঠিক কি? শুধুমাত্র ইউটিসি টাইমজোনগুলিতে বসবাসকারী লোকদের জন্য নয়।
গিলবার্টস

1
@ গিলবার্টস আমি ভাবি না যে কেউ ইউটিসি টাইম জোনে বাস করে। পুরো অঞ্চল জুড়ে ব্যবহৃত সময়ের জন্য ইউটিসি ব্যবহার করা ভাল অনুশীলন হিসাবে সুপারিশ করা হয়। উদাহরণস্বরূপ ভৌগলিকভাবে বিভিন্ন ব্যবহারকারীদের জন্য তারিখের ম্যানিপুলেশন / স্টোরেজের জন্য জাভা সেরা অনুশীলন দেখুন । অথবা আমি আপনার প্রশ্ন বুঝতে পারি না?
ওলে ভিভি

15

জাভা 8 থেকে আপনি কল করতে পারেন java.time.Instant.toEpochMilli()

উদাহরণস্বরূপ কল

final long currentTimeJava8 = Instant.now().toEpochMilli();

আপনি হিসাবে একই ফলাফল দেয়

final long currentTimeJava1 = System.currentTimeMillis();

1
"আপনাকে একই ফলাফল দেয়" ... তবে আরও সিপিইউ শক্তি গ্রহণ করে এবং আবর্জনা সংগ্রহকারীকে আরও অনেক চাপ দেয়।
ভাসিলিনভিকভ

1
আমি উপরের পরিমাণটি দেখতে চাই (বিশেষত সাধারণ ব্যবহারের জন্য - উদাহরণস্বরূপ কিছু পারফরম্যান্স সমালোচিত রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য নয় ...)
ব্রায়ান

11

আপনি java.sql.Timestampমিলিসেকেন্ডগুলি পেতেও এটি ব্যবহার করতে পারেন ।

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);

আপনি একটি সময় অঞ্চলের জন্য অত্যন্ত প্রয়োজনীয়তা উপেক্ষা করছেন। আমি এটি এইভাবে করার পরামর্শ দিচ্ছি না। এছাড়াও Timestampবর্গ দীর্ঘ পুরানো এবং নকশা সমস্যার সঙ্গে ভরা হয়, তাই আমি বরং এটা এড়ানোর চাই, বিশেষ করে যখন আমরা থেকে ক্লাস ব্যবহার করতে পারেন java.timeমত LocalDateTime
ওলে ভিভি

@ OleV.V। এর নকশা সমস্যাগুলি সম্পর্কে কেবল কৌতূহল Timestamp, আপনি কি এটির কোনও নিবন্ধ ভাগ করতে পারেন? এটি Timestampআমার কোড থেকেও ব্যবহার এড়াতে সহায়তা করে । ধন্যবাদ!
নালাম

1
সংক্ষেপে, এটি একটি সাবক্লাস হিসাবে প্রয়োগ করা হয়েছে Dateতবে প্রায়শই এ হিসাবে পরিচালনা করা যায় না DateDateএক কন্সট্রাক্টরের উত্তরাধিকার সূত্রে প্রাপ্ত বেশিরভাগ পদ্ধতি অবমূল্যায়ন করা হয়। এর toStringপদ্ধতিটি জেভিএমের সময় অঞ্চলটি ব্যবহার করে, যা অনেককে বিভ্রান্ত করে যেহেতু একইটি Timestampবিভিন্ন কম্পিউটারে আলাদাভাবে মুদ্রিত হয় ( উদাহরণস্বরূপ )।
ওলে ভিভি

এটি ইউনিট পরীক্ষার জন্য উপযুক্ত। কেবল এখনই প্রতিস্থাপন করুনLocalDate.of(year, month, day)
G_V

"সর্বদা ইউটিসি" মানগুলির কার্যকারণের জন্য এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
LeYAUable


3

আপনার যদি জাভা 8 ক্লক থাকে তবে আপনি ব্যবহার করতে পারেন clock.millis()(যদিও এটি আপনাকে ব্যবহার করার পরামর্শ দেয়)clock.instant() জাভা 8 ইনস্ট্যান্ট পাওয়ার জন্য করার , এটি আরও সঠিক হিসাবে)।

আপনি একটি জাভা 8 ঘড়ি ব্যবহার করবেন কেন? সুতরাং আপনার ডিআই ফ্রেমওয়ার্কে আপনি একটি ঘড়ি বিন তৈরি করতে পারেন:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

এবং তারপরে আপনার পরীক্ষাগুলিতে আপনি এটিকে সহজেই উপহাস করতে পারেন:

@MockBean private Clock clock;

অথবা আপনার আলাদা শিম থাকতে পারে:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

যা পরীক্ষার সাথে সাহায্য করে যা প্রচুর তারিখ এবং সময়গুলিকে জোর দিয়েছিল।


1
  default LocalDateTime getDateFromLong(long timestamp) {
    try {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
    } catch (DateTimeException tdException) {
      //  throw new 
    }
}

default Long getLongFromDateTime(LocalDateTime dateTime) {
    return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}

0

কেন কেউ এই পদ্ধতিটি উল্লেখ করেননি LocalDateTime.toEpochSecond():

LocalDateTime localDateTime = ... // whatever e.g. LocalDateTime.now()
long time2epoch = localDateTime.toEpochSecond(ZoneOffset.UTC);

এটি বেশিরভাগ ক্ষেত্রেই সংক্ষিপ্ত বলে মনে হচ্ছে যে উপরে অনেকে প্রস্তাবিত উত্তর ...


এই আমি খুঁজছিলাম ছিল। এই গৃহীত উত্তরটি আমাকে উইলগুলি দিচ্ছিল।
ব্রিল প্যাপিন

এটি কেবলমাত্র API এ উপলব্ধ 26:
available

1
কারণ এটি মাত্র কয়েক সেকেন্ড দেয়। এটি অদ্ভুত যে কোনও toEpochMilliপদ্ধতি নেই, এটি লোকালডেটটাইমে আপনি এমনকি ন্যানোসেকেন্ডগুলি নির্দিষ্ট করতে পারেন তা বিবেচনায় নেওয়া: একটি পদ্ধতি রয়েছে LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
izogfif
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.