TL; ড
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
.toEpochSecond()
...
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
.plusDays( 1 )
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
.toEpochSecond()
...
"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "
...
myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )
java.time
আপনি আধুনিক জাভা.টাইম ক্লাসগুলি দ্বারা সরবরাহিত উত্তেজনাপূর্ণ পুরানো তারিখের সময় ক্লাসগুলি ব্যবহার করছেন ।
স্পষ্টতই আপনি কিছু সংখ্যার ধরণের কলামে আপনার ডাটাবেসে একটি মুহুর্ত সংরক্ষণ করছেন। ওটা দুর্ভাগ্যজনক. পরিবর্তে আপনার এসকিউএল-স্ট্যান্ডার্ডের মতো কোনও ধরণের কলাম ব্যবহার করা উচিত TIMESTAMP WITH TIME ZONE
। তবে, এই উত্তরের জন্য, আমরা যা আছে তা নিয়ে কাজ করব।
যদি আপনার রেকর্ডগুলি মুহূর্তগুলিকে মিলিসেকেন্ডগুলির রেজোলিউশন সহ উপস্থাপন করে এবং আপনি একটি পুরো দিনের জন্য সমস্ত রেকর্ড চান তবে আমাদের সময়সীমা দরকার। আমাদের অবশ্যই একটি শুরুর মুহূর্ত এবং একটি থামার মুহূর্ত থাকা উচিত। আপনার ক্যোয়ারিতে কেবল একটি একক তারিখ-সময়ের মাপদণ্ড রয়েছে যেখানে এটির একটি জুটি হওয়া উচিত ছিল।
LocalDate
বর্গ সময় অফ দিন এবং সময় জোন ছাড়া ছাড়া একটি তারিখ কেবল-মান প্রতিনিধিত্ব করে।
তারিখ নির্ধারণে একটি সময় অঞ্চল গুরুত্বপূর্ণ। যে কোনও মুহুর্তের জন্য, তারিখটি অঞ্চল অনুসারে বিশ্ব জুড়ে পরিবর্তিত হয়। উদাহরণস্বরূপ, প্যারিসের মধ্যরাতের কয়েক মিনিটের পরে ফ্রান্স একটি নতুন দিন এবং মন্ট্রিয়াল কোয়েবেকের "গতকাল" এখনও রয়েছে ।
যদি কোনও সময় অঞ্চল নির্দিষ্ট না করা থাকে, JVM সুস্পষ্টভাবে তার বর্তমান ডিফল্ট সময় অঞ্চলটি প্রয়োগ করে। ডিফল্ট যে কোনও মুহুর্তে পরিবর্তিত হতে পারে, তাই আপনার ফলাফলগুলি পৃথক হতে পারে। আর্গুমেন্ট হিসাবে আপনার কাঙ্ক্ষিত / প্রত্যাশিত সময় অঞ্চলটি স্পষ্টভাবে উল্লেখ করা ভাল।
একটি নির্দিষ্ট করুন সঠিক সময় অঞ্চল নাম এর বিন্যাসে continent/region
যেমন America/Montreal
, Africa/Casablanca
অথবা Pacific/Auckland
। কখনও যেমন 3-4 চিঠি সংক্ষেপ ব্যবহার EST
বা IST
হিসাবে তারা না সত্য সময় অঞ্চল, না মান, এবং এমনকি অনন্য নয় (!)।
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
আপনি যদি জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি ব্যবহার করতে চান, এটির জন্য জিজ্ঞাসা করুন এবং একটি যুক্তি হিসাবে পাস করুন। বাদ দেওয়া থাকলে, জেভিএমের বর্তমান ডিফল্ট স্পষ্টভাবে প্রয়োগ করা হয়। স্পষ্ট করে বলা ভাল, যেহেতু JVM এর মধ্যে যে কোনও অ্যাপ্লিকেশানের যে কোনও থ্রেডে কোনও কোড দ্বারা রানটাইমের সময় যে কোনও মুহূর্তে ডিফল্টটি পরিবর্তন করা যেতে পারে ।
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
অথবা একটি তারিখ নির্দিষ্ট করুন। আপনি জানুয়ারি-ডিসেম্বরের জন্য 1-12 বুদ্ধিমান সংখ্যার সাথে একটি সংখ্যা দ্বারা মাস নির্ধারণ করতে পারেন।
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
বা, আরও ভাল, Month
এনাম অবজেক্টগুলি প্রাক-সংজ্ঞায়িত ব্যবহার করুন , বছরের প্রতিমাসের জন্য একটি। টিপ: Month
আপনার কোডটি আরও স্ব-ডকুমেন্টিং করতে, বৈধ মানগুলি নিশ্চিত করতে এবং টাইপ-সুরক্ষা সরবরাহ করতে কেবল কোডগ্রাফিকের চেয়ে বরং আপনার কোডবেজ জুড়ে এই বিষয়গুলি ব্যবহার করুন ।
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
একটি সঙ্গে LocalDate
হাত, আমরা রুপান্তর পাশে চাই যে মুহূর্তে, শুরু এবং দিনের স্টপ একজোড়া মধ্যে। অনুমান করবেন না যে দিনটি শুরু হয়ে যায় 00:00:00 দিনের সময় থেকে। ডাইটলাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলির কারণে, দিনটি অন্য সময় যেমন শুরু হতে পারে যেমন 01:00:00। সুতরাং জাভা.টাইম দিনের প্রথম মুহূর্তটি নির্ধারণ করুন। আমরা এই জাতীয় কোনও অসঙ্গতি সন্ধান করতে একটি ZoneId
যুক্তি পাস করি LocalDate::atStartOfDay
। ফলাফল ক ZonedDateTime
।
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;
সাধারণত একটি সময় বিঘত সংজ্ঞা সেরা পদ্ধতির হাফ-উন্মুক্ত পদ্ধতির যেখানে শুরুতে হয় সমেত যখন বিভক্তি একচেটিয়া । সুতরাং কোনও দিন তার প্রথম মুহুর্তের সাথে শুরু হয় এবং পরবর্তী দিনের প্রথম মুহুর্ত পর্যন্ত চলে তবে তা অন্তর্ভুক্ত নয়।
ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ; // Determine the following date, and ask for the first moment of that day.
পুরো দিনের জন্য আমাদের ক্যোয়ারী এসকিউএল কমান্ডটি ব্যবহার করতে পারে না BETWEEN
। সেই কমান্ডটি ফুল-ক্লোজড ( []
) প্রথম এবং শেষ উভয়ই অন্তর্ভুক্ত রয়েছে যেখানে আমরা হাফ-ওপেন ( [)
) চাই। আমরা একজোড়া মানদণ্ড >=
এবং ব্যবহার করি <
।
আপনার কলামটি খারাপ নাম দেওয়া হয়েছে। বিভিন্ন ডাটাবেস দ্বারা সংরক্ষিত হাজার শব্দগুলির মধ্যে যে কোনও একটি এড়িয়ে চলুন। placed
এই উদাহরণে ব্যবহার করা যাক ।
আপনার ?
কোডগুলিতে আমাদের মুহুর্তগুলি নির্দিষ্ট করার জন্য স্থানধারক ব্যবহার করা উচিত ।
String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;
তবে আমাদের ZonedDateTime
হাতে বস্তু রয়েছে, যখন আপনার ডেটাবেসটি দৃশ্যত উপরোক্ত আলোচনা অনুসারে পূর্ণসংখ্যা সংরক্ষণ করছে। আপনি যদি আপনার কলামটি সঠিকভাবে সংজ্ঞা দিয়েছিলেন তবে আমরা ZonedDateTime
জেডিবিসি ৪.২ বা তার পরে সমর্থনকারী যে কোনও জেডিবিসি ড্রাইভারের সাহায্যে অবজেক্টগুলি পাস করতে পারি ।
তবে পরিবর্তে আমাদের পুরো সেকেন্ডে একটি গণনা-থেকে-পর্ব পেতে হবে। আমি ধরে নেব আপনার যুগের রেফারেন্সের তারিখটি ইউটিসিতে 1970 সালের প্রথম মুহুর্ত। ZonedDateTime
ক্লাস ন্যানোসেকেন্ড রেজোলিউশনে সক্ষম হওয়ায় সম্ভাব্য ডেটা ক্ষতি থেকে সাবধান থাকুন । যে কোনও ভগ্নাংশের দ্বিতীয়টি নিম্নলিখিত লাইনে ছাঁটা হবে।
long start = zdtStart().toEpochSecond() ; // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ;
এখন আমরা উপরের সংজ্ঞায়িত আমাদের এসকিউএল কোডটিতে সেই পূর্ণসংখ্যাগুলি পাস করতে প্রস্তুত।
PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();
আপনি যখন থেকে পূর্ণসংখ্যার মানগুলি পুনরুদ্ধার করেন ResultSet
, আপনি Instant
বস্তুগুলিতে (সর্বদা ইউটিসিতে) বা ZonedDateTime
বস্তুগুলিতে (একটি নির্ধারিত সময় অঞ্চল সহ) রূপান্তর করতে পারেন ।
Instant instant = rs.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
সম্পর্কিত জাভা.টাইম
Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই শ্রেণীর বিরক্তিজনক পুরাতন স্থানচ্যুত উত্তরাধিকার যেমন তারিখ-সময় শ্রেণীর java.util.Date
,Calendar
, &SimpleDateFormat
।
Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।
আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেকগুলি উদাহরণ এবং ব্যাখ্যাগুলির জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশন হয় জেএসআর 310 ।
জাভা.টাইম ক্লাস কোথায় পাবেন?
ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে ভবিষ্যতের সম্ভাব্য সংযোজনগুলির একটি প্রমাণকারী ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval
, YearWeek
, YearQuarter
, এবং আরো ।