লোকালডেট এবং লোকালডেটটাইম থেকে পর্ব কীভাবে বের করবেন?


107

কিভাবে আমি যুগান্তকারী মান বের কর Longদৃষ্টান্ত থেকে LocalDateTimeবা LocalDate? আমি নিম্নলিখিত চেষ্টা করেছি, কিন্তু এটি আমাকে অন্যান্য ফলাফল দেয়:

LocalDateTime time = LocalDateTime.parse("04.02.2014  19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy  HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105

আমি যা চাই তা কেবল 1391539861স্থানীয় তারিখের জন্য মান "04.02.2014 19:51:01"। আমার টাইমজোনটি Europe/Osloইউটিসি + 1 দিবালোকের সময় সাশ্রয়ের সময় সহ।


দয়া করে আপনার প্রত্যাশিত সংখ্যা 1396468261 ব্যাখ্যা করুন time আমি টাইমজোন সংশোধন ছাড়াই পেতে পারি: 1391543461 (আমার উত্তরে সম্পাদনা দেখুন)। 57 দিনের পার্থক্য!
মেনো হচচাইল্ড

@ মেনোহচসচাইল্ড আমি আমার প্রশ্নকে টাইমজোন তথ্য দিয়ে আপডেট করেছি এবং জিটিএম থেকে স্থানীয় সময়কে আসল মান সংশোধন করেছি। LocalDateTimeএটি ম্যানুয়ালি গণনা করা ছাড়া অন্য কোনওটির যুগের সহজ উপায় আছে ?

আমার বিরতি থেকে ফিরে আসছে, আমার আপডেট দেখুন।
মেনো হচসচাইল্ড

উত্তর:


155

ক্লাসগুলি LocalDateএবং টাইমজোন বা অফসেটের সময়LocalDateTime সম্পর্কে তথ্য ধারণ করে না এবং যুগের পর থেকে কয়েক সেকেন্ড এই তথ্যটি ব্যতীত আকাঙ্ক্ষিত হবে। যাইহোক, একটি উদাহরণ পাস করার মাধ্যমে অবজেক্টগুলির তারিখ / সময় অবজেক্টগুলিকে টাইমজোনগুলির সাথে রূপান্তর করার জন্য কয়েকটি পদ্ধতি রয়েছে ।ZoneId

স্থানীয় তারিখ

LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();

লোকালডেটটাইম

LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();

4
জোনআইড ব্যবহার করা বা কাস্টমাইজড, ধ্রুবক জোনআইড উদাহরণ (+0 অর্থ, জিএমটি) এর সাথে ব্যবহার করা কি এড়ানো সম্ভব? আমি এটি জিজ্ঞাসা করছি কারণ আমি চাই সমস্ত গণনা এটিতে স্বাভাবিক হয়। এছাড়াও, আমি কীভাবে এর বিপরীত করব: যুগের সময় থেকে লোকালডেট / লোকালডেটটাইমে রূপান্তর করুন (জোনোনড ছাড়াও, বা জিএমটি সহ)?
অ্যান্ড্রয়েড বিকাশকারী

4
কিছু মনে করো না. এটি খুঁজে ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
অ্যান্ড্রয়েড বিকাশকারী

7
একটি সহজ পন্থা কেবল long epoch = time.toEpochSecond(ZoneOffset.UTC)ইউটিসি কেসগুলির জন্য, বা যেখানে আপনি ইতিমধ্যে টাইমজোনটি জানেন বা long epoch = time.toEpochSecond(ZoneId.systemDefault());আপনি যদি সেই রুটটিতে যেতে চান তবে।
মার্কাস

এটি হাস্যকর মনে হতে পারে তবে কীভাবে যুগে যুগে লোকালডেট, লোকালটাইম এবং লোকাল ডেটটাইমে রূপান্তর করা যায়
সামুয়েল ওওনো

কিছু মনে করবেন না আমি মনে করি এটি খুঁজে পেয়েছি; Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
সামিউল ওউইনো

28

'মিলিস যেহেতু ইউনিক্স যুগের আগে' তাত্ক্ষণিকভাবে প্রতিনিধিত্ব করে, তাই আপনার তাত্ক্ষণিক ক্লাসটি ব্যবহার করা উচিত:

private long toEpochMilli(LocalDateTime localDateTime)
{
  return localDateTime.atZone(ZoneId.systemDefault())
    .toInstant().toEpochMilli();
}

এটি ব্যবহার করা ভুল ZoneId.systemDefault()কারণ ইউনিক্সের যুগটি ইউটিসি
এসিভি

10

আপনার যে রূপান্তরটির প্রয়োজন তা ইউটিসি / গ্রিচ থেকে অফসেট বা একটি সময় অঞ্চল প্রয়োজন।

আপনি একটি অফসেট করে থাকেন, সেখানে একটি হল ডেডিকেটেড পদ্ধতি উপর LocalDateTimeএই কাজের জন্য:

long epochSec = localDateTime.toEpochSecond(zoneOffset);

আপনার যদি কেবলমাত্র একটি থাকে ZoneIdতবে আপনি নিম্নলিখিতগুলি ZoneOffsetথেকে এটি পেতে পারেন ZoneId:

ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);

তবে আপনি ZonedDateTimeসহজ মাধ্যমে রূপান্তর খুঁজে পেতে পারেন :

long epochSec = ldt.atZone(zoneId).toEpochSecond();

4
আপনি যদি কেবল ইউটিসির বিষয়ে চিন্তা করেন তবে সেখানে রয়েছেlong epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
রুহং

2

এ লুক এই পদ্ধতি যা ক্ষেত্র সমর্থিত দেখতে। আপনি এর জন্য পাবেন LocalDateTime:

•NANO_OF_SECOND 
•NANO_OF_DAY 
•MICRO_OF_SECOND 
•MICRO_OF_DAY 
•MILLI_OF_SECOND 
•MILLI_OF_DAY 
•SECOND_OF_MINUTE 
•SECOND_OF_DAY 
•MINUTE_OF_HOUR 
•MINUTE_OF_DAY 
•HOUR_OF_AMPM 
•CLOCK_HOUR_OF_AMPM 
•HOUR_OF_DAY 
•CLOCK_HOUR_OF_DAY 
•AMPM_OF_DAY 
•DAY_OF_WEEK 
•ALIGNED_DAY_OF_WEEK_IN_MONTH 
•ALIGNED_DAY_OF_WEEK_IN_YEAR 
•DAY_OF_MONTH 
•DAY_OF_YEAR 
•EPOCH_DAY 
•ALIGNED_WEEK_OF_MONTH 
•ALIGNED_WEEK_OF_YEAR 
•MONTH_OF_YEAR 
•PROLEPTIC_MONTH 
•YEAR_OF_ERA 
•YEAR 
•ERA 

INSTANT_SECONDS ক্ষেত্রটি অবশ্যই - সমর্থিত নয় কারণ LocalDateTimeএটি কোনও পরম (গ্লোবাল) টাইমস্ট্যাম্পকে উল্লেখ করতে পারে না। তবে সহায়কটি হল EPOCH_DAY ক্ষেত্র যা 1970-01-01 থেকে অতিবাহিত দিন গণনা করে। অনুরূপ চিন্তাভাবনা প্রকারের জন্য বৈধ LocalDate(আরও কম সমর্থিত ক্ষেত্র সহ)।

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

আপনার প্রশ্নে এবং আপনার কোডের নম্বরগুলিতে ফিরে আসছেন:

The result 1605 is correct
  => (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1

16105L * 86400 + 71461 = 1970151-01T00 সাল থেকে 1391543461 সেকেন্ড: 00: 00 (মনোযোগ, টাইমজোন নেই) তারপরে আপনি টাইমজোন অফসেট বিয়োগ করতে পারেন (মিলিসেকেন্ডে যদি 1000 দ্বারা সম্ভব গুণনের জন্য নজর রাখুন)।

প্রদত্ত সময় অঞ্চল তথ্য পরে আপডেট করুন:

local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861

দুটি সমতুল্য পদ্ধতির সাথে জেএসআর -310-কোড হিসাবে:

long secondsSinceUnixEpoch1 =
  LocalDateTime.of(2014, 2, 4, 19, 51, 1).atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();

long secondsSinceUnixEpoch2 =
  LocalDate
    .of(2014, 2, 4)
    .atTime(19, 51, 1)
    .atZone(ZoneId.of("Europe/Oslo"))
    .toEpochSecond();

4
ব্যাখ্যার জন্য ধন্যবাদ. LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));এবং তারপরে ব্যবহার করে সঠিক ফলাফল পেয়েছি Long epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();

1

মানব পাঠযোগ্য তারিখ থেকে যুগকে রূপান্তর করুন :

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

যুগ থেকে মানব পাঠযোগ্য তারিখে রূপান্তর করুন :

String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));

অন্যান্য ভাষার রূপান্তরকারীদের জন্য: https://www.epochconverter.com


0

অঞ্চলটি সময় ব্যয় না করে এটিই একটি উপায়:

LocalDateTime now = LocalDateTime.now();
long epoch = (now.getLong(ChronoField.EPOCH_DAY) * 86400000) + now.getLong(ChronoField.MILLI_OF_DAY);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.