দেখে মনে হচ্ছে যে বর্তমান টাইমজোনটির জন্য আপনার সময় নির্ধারণের সময় যতক্ষণ সার্ভারে টাইমজোন রয়েছে তাতে কিছু আসে যায় না, আপনি যে ডেটটাইম কলামগুলি সঞ্চয় করেন তার টাইমজোনটি জানেন এবং দিবালোকের সঞ্চয় সময় সহ সমস্যাগুলি সম্পর্কে সচেতন হন।
অন্যদিকে আপনি যে সার্ভারগুলির সাথে কাজ করেন তার টাইমজোনগুলির নিয়ন্ত্রণ যদি আপনার থাকে তবে আপনি অভ্যন্তরীণভাবে ইউটিসি-তে সেট হয়ে যেতে পারেন এবং টাইমজোন এবং ডিএসটি নিয়ে কখনই চিন্তা করবেন না।
আমি কীভাবে নিজের এবং অন্যদের জন্য চিটপত্রের ফর্ম হিসাবে টাইমজোনগুলির সাথে কীভাবে কাজ করব তা সংগ্রহ করার জন্য এখানে কিছু নোট দেওয়া আছে যা ব্যক্তি তার সার্ভারের জন্য টাইমজোনটি কী বেছে নেবে এবং কীভাবে সে তারিখ এবং সময় সঞ্চয় করবে তা প্রভাবিত করতে পারে।
মাইএসকিউএল টাইমজোন চিটশিট
মন্তব্য:
- টাইমজোন পরিবর্তন করা সঞ্চিত ডেটটাইম বা টাইমস্ট্যাম্প পরিবর্তন করবে না , তবে এটি টাইমস্ট্যাম্প কলাম থেকে আলাদা ডেটটাইম নির্বাচন করবে
- সতর্কবাণী! ইউটিসি'র লিপ সেকেন্ড রয়েছে, এগুলি দেখতে '2012-06-30 23:59:60' এর মতো এবং পৃথিবীর আবর্তনের গতি কমার কারণে 6 মাস পূর্বে নোটিশ সহ এলোমেলোভাবে যুক্ত করা যেতে পারে
GMT কয়েক সেকেন্ড বিভ্রান্ত করে, এজন্য ইউটিসি আবিষ্কার হয়েছিল was
সতর্কবাণী! দিবালোক সঞ্চয়ের সময়কালের কারণে বিভিন্ন আঞ্চলিক সময় অঞ্চল একই তারিখের মান উত্পাদন করতে পারে
- টাইমস্ট্যাম্প কলাম কেবল সীমাবদ্ধতার কারণে 1970-01-01 00:00:01 থেকে 2038-01-19 03:14:07 ইউটিসি তারিখগুলি সমর্থন করে ।
অভ্যন্তরীণভাবে একটি মাইএসকিউএল টাইমস্ট্যাম্প কলামটি ইউটিসি হিসাবে সংরক্ষণ করা হয় তবে কোনও তারিখ নির্বাচন করার সময় মাইএসকিউএল এটিকে স্বয়ংক্রিয়ভাবে বর্তমান সেশন টাইমজোনতে রূপান্তরিত করে।
টাইমস্ট্যাম্পে কোনও তারিখ সংরক্ষণ করার সময়, মাইএসকিউএল ধরে নেবে যে তারিখটি বর্তমান সেশনের টাইমজোনটিতে রয়েছে এবং স্টোরেজের জন্য এটি ইউটিসিতে রূপান্তরিত করে।
- মাইএসকিউএল ডেটটাইম কলামগুলিতে আংশিক তারিখগুলি সঞ্চয় করতে পারে, এটি "2013-00-00 04:00:00" এর মতো দেখায়
- মাইএসকিউএল "0000-00-00 00:00:00" সংরক্ষণ করে যদি আপনি একটি ডেটটাইম কলাম NULL হিসাবে সেট করেন, যদি না আপনি নির্দিষ্টভাবে কলামটি তৈরি করার সময় শূন্য করার অনুমতি দেয়।
- এটি পড়ুন
ইউটিসি ফর্ম্যাটে একটি টাইমস্ট্যাম্প কলাম নির্বাচন করতে
বর্তমান মাইএসকিউএল সেশনে টাইমজোনটি কী তা বিবেচ্য নয়:
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
আপনি ইউটিসি তে সেভার বা গ্লোবাল বা বর্তমান সেশন টাইমজোন সেট করতে পারেন এবং তারপরে টাইমস্ট্যাম্পটি নির্বাচন করতে পারেন:
SELECT `timestamp_field` FROM `table_name`
ইউটিসিতে বর্তমান তারিখের সময়টি নির্বাচন করতে:
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');
উদাহরণ ফলাফল: 2015-03-24 17:02:41
সেশন টাইমজোনটিতে বর্তমান তারিখের সময়টি নির্বাচন করতে
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
সার্ভার চালু হওয়ার সময় সেট করা সময় অঞ্চল নির্বাচন করতে
SELECT @@system_time_zone;
উদাহরণস্বরূপ, মস্কোর সময়ের জন্য "এমএসকে" বা "+04: 00" প্রদান করে, এখানে মাইএসকিউএল বাগ রয়েছে (বা ছিল) যেখানে যদি একটি সংখ্যাসূচক অফসেট সেট করা থাকে তবে এটি দিবালোক সঞ্চয় সময় সামঞ্জস্য করে না
বর্তমান সময় অঞ্চল পেতে
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
আপনার টাইমজোনটি +2: 00 হলে এটি ফিরে আসবে 02:00:00।
বর্তমান ইউনিক্স টাইমস্ট্যাম্প পেতে (সেকেন্ডে):
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();
UNIX টাইমস্ট্যাম্প হিসাবে টাইমস্ট্যাম্প কলাম পেতে
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
ইউনিক্স টাইমস্ট্যাম্প হিসাবে একটি ইউটিসি ডেটটাইম কলাম পেতে
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
ইতিবাচক ইউনিক্স টাইমস্ট্যাম্প পূর্ণসংখ্যার থেকে বর্তমান টাইমজোন ডেটটাইম পান
SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`
ইউনিক্স টাইমস্ট্যাম্প থেকে একটি ইউটিসি ডেটটাইম পান
SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`
নেতিবাচক UNIX টাইমস্ট্যাম্প পূর্ণসংখ্যার থেকে বর্তমান টাইমজোন ডেটটাইম পান
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
3 টি জায়গা রয়েছে যেখানে মাইএসকিউএলে টাইমজোন সেট করা যেতে পারে:
দ্রষ্টব্য: একটি সময় অঞ্চল 2 ফর্ম্যাটে সেট করা যেতে পারে:
- ইউটিসি থেকে অফসেট: '+00: 00', '+10: 00' বা '-6: 00'
- নামযুক্ত সময় অঞ্চল হিসাবে: 'ইউরোপ / হেলসিঙ্কি', 'মার্কিন / পূর্ব', বা 'এমইটি'
মাইএসকিএল ডাটাবেজে টাইম জোনের তথ্য সারণী তৈরি এবং পপুলেটেড করা হলে নামযুক্ত সময় অঞ্চলগুলি ব্যবহার করা যেতে পারে।
"my.cnf" ফাইলটিতে
default_time_zone='+00:00'
অথবা
timezone='UTC'
@@ গ্লোবাল.টাইম_জোন ভেরিয়েবল
তারা কি মান সেট করা হয় তা দেখতে
SELECT @@global.time_zone;
এর জন্য একটি মান সেট করতে একটি ব্যবহার করুন:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
@@ সেশন.টাইম_জোন ভেরিয়েবল
SELECT @@session.time_zone;
সেট করতে এটি একটি ব্যবহার করুন:
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
"@@ গ্লোবাল.টাইম_জোন ভেরিয়েবল" এবং "@@ সেশন.টাইম_জোন ভেরিয়েবল" উভয়ই "SYSTEM" প্রত্যাবর্তন করতে পারে যার অর্থ তারা "my.cnf" তে টাইমজোন সেটটি ব্যবহার করে।
টাইমজোন নামগুলি কাজ করার জন্য (এমনকি ডিফল্ট-সময়-অঞ্চলের জন্যও) আপনাকে অবশ্যই আপনার টাইমজোন তথ্য সারণীগুলি পপুলেট করতে হবে: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support। এইচটিএমএল
দ্রষ্টব্য: আপনি এটি করতে পারবেন না কারণ এটি নাল ফিরে আসবে:
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
মাইএসকিএল টাইমজোন সারণী সেটআপ করুন
জন্য CONVERT_TZ
কাজ, আপনি প্রয়োজন টাইমজোন টেবিল জনবহুল করা
SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;
যদি তারা খালি থাকে, তবে এই আদেশটি চালিয়ে এগুলি পূরণ করুন
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
যদি এই কমান্ডটি আপনাকে ত্রুটিটি দেয় " সারি 1 এর কলাম 'সংক্ষেপণের জন্য খুব দীর্ঘ ডেটা ", তবে এটি সময় নূন্য সংক্ষেপণের শেষে কোনও NULL অক্ষর যুক্ত হওয়ার কারণে হতে পারে
এটি চালানো হচ্ছে ঠিক করা
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
(আপনার সার্ভারের ডিএসটি নিয়মগুলি আপ টু ডেট রয়েছে তা নিশ্চিত করুন zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )
প্রতিটি টাইমজোনের জন্য সম্পূর্ণ ডিএসটি (দিবালোক সংরক্ষণের সময়) রূপান্তর ইতিহাস দেখুন
SELECT
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC
CONVERT_TZ
উপরের টেবিলগুলিতে এবং আপনি যে তারিখটি ব্যবহার করেন তার বিধিগুলির ভিত্তিতে প্রয়োজনীয় ডিএসটি পরিবর্তনগুলি প্রয়োগ করে।
দ্রষ্টব্য: দস্তাবেজগুলির
মতে , সময়_ অঞ্চলের জন্য আপনি যে মান নির্ধারণ করেছেন তা পরিবর্তিত হয় না, উদাহরণস্বরূপ যদি আপনি এটি "+01: 00" হিসাবে সেট করেন তবে সময়_ অঞ্চলটি ইউটিসি থেকে অফসেট হিসাবে সেট করা হবে, যা ডিএসটি অনুসরণ করে না, তাই এটি সারা বছর একই থাকবে।
দিবালোকের সঞ্চয়ের সময় কেবল নামমাত্র সময় অঞ্চলগুলি পরিবর্তন করবে।
সংক্ষিপ্তসারগুলি CET
সর্বদা শীতের সময় এবং CEST
গ্রীষ্মের সময় হবে যখন +01: 00 সর্বদা UTC
সময় +1 ঘন্টা হবে এবং উভয়ই ডিএসটি দিয়ে পরিবর্তন হবে না।
system
সময় অঞ্চল হোস্ট মেশিনের যেখানে MySQL ইনস্টল করা হয়েছে তার সময় অঞ্চল হতে হবে (যদি না মাইএসকিউএল তা নির্ধারণ করতে ব্যর্থ)
আপনি এখানে ডিএসটি নিয়ে কাজ করার বিষয়ে আরও পড়তে পারেন
সম্পর্কিত প্রশ্নগুলি:
সূত্র: