লোকাল ডেটকে লোকালডেটটাইম বা জাভা.এসকিএল। টাইমস্ট্যাম্পে রূপান্তর করুন


126

আমি জোডটাইম 1.6.2 ব্যবহার করছি।

আমার একটি আছে LocalDateযা আমাকে একটি (জোদা) LocalDateTime, বা java.sqlTimestampঅর্ম্যাপিংয়ের জন্য রূপান্তর করতে হবে।

এর কারণ হ'ল আমি কীভাবে একটি LocalDateTimeএবং একটিতে রূপান্তর করতে পারি তা নির্ধারণ করেছি java.sql.Timestamp:

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

সুতরাং, আমি যদি কেবলমাত্র LocalDateএবং এর মধ্যে রূপান্তর LocalDateTimeকরতে পারি তবে আমি ক্রমাগত রূপান্তর করতে পারি java.sql.Timestamp। সঠিক দিকের কোনও ধরণের জন্য ধন্যবাদ!


এফওয়াইআই, জোদা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে , দলটি জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশনের পরামর্শ দিচ্ছেওরাকল দ্বারা টিউটোরিয়াল দেখুন । এছাড়াও, java.sql.Timestampক্লাসটি এখন উত্তরাধিকার, জাভা.টাইম ক্লাসগুলি দ্বারা বিশেষত দ্বারা সরবরাহ করা Instant
তুলিল বাউর্ক

উত্তর:


269

JodaTime

জোদাটাইমকে রূপান্তর org.joda.time.LocalDateকরতে java.sql.Timestamp, কেবলমাত্র করুন

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

জোদাটাইমকে রূপান্তর org.joda.time.LocalDateTimeকরতে java.sql.Timestamp, কেবলমাত্র করুন

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

জাভা 8 এর রূপান্তর java.time.LocalDateকরতে java.sql.Timestamp, শুধু করুন

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

জাভা 8 এর রূপান্তর java.time.LocalDateTimeকরতে java.sql.Timestamp, শুধু করুন

Timestamp timestamp = Timestamp.valueOf(localDateTime);

সমস্ত গুলি বৈধ গুলি হিসাবে রূপান্তর LocalDateTimeকরার সময় নজর রাখুন । উত্স: joda-time.sourceforge.net/faq.html#illegalinstant এবং স্রেফ এটিতে চলছে। DateTimeLocalDateTimeDateTime
ক্রিস্টোফ দে ট্রয়য়ার

মান হিসাবে অফার হিসাবে সংকলন ত্রুটি পেয়েছে () একটি স্ট্রিং গ্রহণ করে।
দেশপ্রেমিক

@ প্যাট্রিয়টিক: আপনি কেবল জাভা এসই ১.৮ বা তার চেয়ে বেশি ব্যবহার না করলেই কেবল এটি ঘটবে। উত্তর এবং Javadoc প্রদান করা লিঙ্কগুলি নির্দেশিত (উপরে উত্তরে নীল গ্রন্থে আসলে লিঙ্ক, আপনি তাদের ক্লিক Javadoc ডাউন কসরত পারে), Timestamp#valueOf()পদ্ধতি গ্রহণ করে যেহেতু জাভা SE এছাড়াও 1.8 একটি LocalDateTime
বালুসসি

60

জাভা 8 সময়ের এপিআই ব্যবহারের সর্বোত্তম উপায়:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(ldt);

জেপিএ ব্যবহারের জন্য আপনার মডেলের সাথে রাখুন ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/ using-java-8-datetime-classes-jpa ):

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

সুতরাং এখন এটি সময় সম্পর্কিত আপেক্ষিক স্বাধীন সময়। অতিরিক্তভাবে এটি করা সহজ:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

বিন্যাস করা:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

আপডেট: পোস্টগ্রেস 9.4.1208, এইচএসকিউএলডিবি 2.4.0 ইত্যাদি জাভা 8 টাইম এপিআই বুঝতে পারে কোনও কথোপকথন ছাড়াই!


17

TL; ড

Joda-টাইম প্রকল্পের রক্ষণাবেক্ষণ-মোড, এখন দ্বারা supplanted হয় java.time ক্লাস।

  • শুধুjava.time.Instant ক্লাস ব্যবহার করুন
  • প্রয়োজন নেই:
    • LocalDateTime
    • java.sql.Timestamp
    • স্ট্রিংস

ইউটিসিতে বর্তমান মুহুর্তটি ক্যাপচার করুন।

Instant.now()  

এই মুহূর্তটি ডাটাবেসে সংরক্ষণ করতে:

myPreparedStatement.setObject(  , Instant.now() )  // Writes an `Instant` to database.

ডেটাবেস থেকে সেই মুহূর্তটি পুনরুদ্ধার করতে:

myResultSet.getObject(  , Instant.class )  // Instantiates a `Instant`

নির্দিষ্ট সময় অঞ্চলের সাথে প্রাচীর-ঘড়ির সময় সামঞ্জস্য করতে।

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime ভুল বর্গ হয়

অন্যান্য উত্তরগুলি সঠিক, তবে তারা এটি উল্লেখ করতে ব্যর্থ হয়েছে যে LocalDateTimeএটি আপনার উদ্দেশ্যটির জন্য ভুল শ্রেণি।

উভয় ইন java.time এবং Joda-টাইম , একটি LocalDateTimeইচ্ছাপূর্বক সময় অঞ্চল কোন ধারণা বা অভাব আছে অফসেট-থেকে-ইউটিসি। যেমনটি, এটি কোনও মুহুর্তের প্রতিনিধিত্ব করে না এবং সময়রেখার কোনও বিষয় নয় । এ প্রায় 26-27 ঘন্টা ব্যাপ্তি সহ সম্ভাব্য মুহুর্তগুলি LocalDateTimeসম্পর্কে মোটামুটি ধারণা উপস্থাপন করে ।

একটি ব্যবহার করুন LocalDateTime, হয় জোন / অফসেট অজানা (একটি ভাল অবস্থা), অথবা যখন জোন-অফসেট অনির্দিষ্ট যখন। উদাহরণস্বরূপ, "ক্রিসমাস 25 ডিসেম্বর, 2018 এর প্রথম মুহূর্তে শুরু হয়" এ হিসাবে প্রতিনিধিত্ব করা হবে LocalDateTime

ZonedDateTimeএকটি নির্দিষ্ট সময় অঞ্চলে একটি মুহুর্ত উপস্থাপন করতে একটি ব্যবহার করুন । উদাহরণস্বরূপ, ক্রিসমাস যেমন কোন নির্দিষ্ট অঞ্চলে শুরু Pacific/Aucklandবা America/Montrealএকটি সঙ্গে প্রতিনিধিত্ব করা হবে ZonedDateTimeঅবজেক্ট।

সর্বদা ইউটিসিতে একটি মুহুর্তের জন্য, ব্যবহার করুন Instant

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

একটি সময় অঞ্চল প্রয়োগ করুন। একই মুহুর্ত, একই লাইনে সময়রেখায়, তবে একটি ভিন্ন দেয়াল-ঘড়ির সাথে দেখা হয়েছে।

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

সুতরাং, আমি যদি কেবল লোকালডিট এবং লোকালডেটটাইমের মধ্যে রূপান্তর করতে পারি,

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

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

আপনি যদি দিনের প্রথম মুহূর্তটিকে আপনার সময়ের সময়ের হিসাবে চান তবে জাভা.টাইম সেই মুহুর্তটি নির্ধারণ করুন। অনুমান করবেন না যে দিনটি শুরু হয় 00:00:00 এ। ডাইটলাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলির অর্থ দিনটি অন্য সময় যেমন 01:00:00 এর আগে শুরু হতে পারে।

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp ভুল বর্গ হয়

java.sql.Timestampবিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর যে এখন উত্তরাধিকার হয়, দ্বারা সম্পূর্ণরূপে supplanted অংশ java.time ক্লাস। সেই শ্রেণিটি ইউটিসিতে ন্যানোসেকেন্ডগুলির রেজোলিউশন সহ একটি মুহুর্তের প্রতিনিধিত্ব করতে ব্যবহৃত হয়েছিল । সেই উদ্দেশ্যটি এখনই পরিবেশন করা হয়েছে java.time.Instant

জেডিবিসি ৪.২ সহ getObject/setObject

এর মতো JDBC এর 4.2 এবং পরে, আপনার JDBC ড্রাইভার সরাসরি বিনিময় করতে পারেন java.time কল করে ডাটাবেসের অবজেক্টের:

উদাহরণ স্বরূপ:

myPreparedStatement.setObject(  , instant ) ;

… এবং …

Instant instant = myResultSet.getObject(  , Instant.class ) ;

উত্তরাধিকার রূপান্তর ⬌ আধুনিক

আপনার যদি অবশ্যই পুরানো কোড সহ জাভা.টাইমে আপডেট না হয়ে ইন্টারফেস করতে হয় তবে পুরানো ক্লাসগুলিতে যুক্ত নতুন পদ্ধতি ব্যবহার করে পিছনে রূপান্তর করুন।

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

…এবং…

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

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

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

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

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

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

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

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


5

আপনার সময় অঞ্চলের উপর নির্ভর করে আপনি কয়েক মিনিট হারাতে পারেন (1650-01-01 00:00:00 1649-12-31 23:52:58 হয়ে যায়)

এটি এড়াতে নিম্নলিখিত কোডটি ব্যবহার করুন

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);

3

যেহেতু জোদা ম্লান হয়ে যাচ্ছে, কেউ জাভা 8 তে রূপান্তর LocaltDateকরতে চাইতে পারে LocalDateTimeজাভা 8-এ LocalDateTimeএটি এবং LocalDateTimeব্যবহার করে একটি উদাহরণ তৈরি করার উপায় দেবে । এখানে চেক করুন।LocalDateLocalTime

সর্বজনীন স্থিতিশীল স্থানীয় তারিখের সময় (স্থানীয় তারিখ তারিখ, স্থানীয় সময় সময়)

নমুনা হবে,

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

কেবল রেফারেন্সের জন্য, নীচের যুগের সেকেন্ডগুলি পাওয়ার জন্য ব্যবহার করা যেতে পারে,

    ZoneId zoneId = ZoneId.systemDefault();
    long epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);

LocalDateTimeএখানে মোটেও ব্যবহার করার দরকার নেই । এই শ্রেণীর উদ্দেশ্যমূলকভাবে সময় অঞ্চল বা ইউটিসি-থেকে অফসেটের কোনও ধারণা নেই। সুতরাং এটি এখানে কোন কার্যকর উদ্দেশ্য পরিবেশন করে। পরিবর্তে: LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()অনুমান করবেন না যে দিনটি শুরু হয় 00:00 এ, সবসময় হয় না।
তুলসী বাউরক

ওহ, আপনি কি বোঝাতে চাইছেন না যে দিনটি শুরু হয় 00.00
প্রাইম

1
ডাইটলাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলির অর্থ হ'ল কিছু জায়গায় কিছু তারিখে দিনটি অন্য সময় শুরু হতে পারে যেমন 01:00:00। সুতরাং, ধরে নেওয়ার পরিবর্তে, জাভা.টাইমকেjava.time.LocalDate.atStartOfDay একটি পাওয়ার জন্য কল করে প্রথম মুহূর্তটি নির্ধারণ করুন ZonedDateTimeআমার উত্তরে উদাহরণ দেখুন । আমি যেমন মন্তব্য করেছি, LocalDateTimeক্লাসটি এই সমস্ত ক্ষেত্রে অকেজো এবং প্রতি-উত্পাদনশীল।
বাসিল বার্ক

সুতরাং LocalDateTimeআমরা একটি ব্যবহার করা আবশ্যক ZoneId?
প্রধানমন্ত্রী

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


0

জাভা 8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

দরকারী, কিন্তু সত্যিই প্রশ্নের উত্তর বলে মনে হচ্ছে না।
ওলে ভিভি

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