2017-06-13 21 views
8

में स्ट्रेटोटाइम() का उपयोग करते समय विभिन्न टाइमस्टैम्प डेटाबेस में संग्रहीत एक तिथि है। तिथि 2017-03-01 है। क्षेत्र एक "तारीख" -फील्ड है।PHP और UNIX_TIMESTAMP() में strtotime() में MySQL

जब मैं अपने MySQL क्वेरी, "2017/03/01" प्रदर्शित किया जाता है में

DATE_FORMAT(orderdate, '%d.%m.%Y') as mydate 

का उपयोग करें।

जब मैं

UNIX_TIMESTAMP(orderdate) as mydate 

का उपयोग करें और उत्पादन यह date('d.m.Y', $mydate) तरह

मैं एक परिणाम के रूप 2017/02/28 मिलता है।

क्या यह एक "फरवरी-समस्या" है? मैं तारीख कैसे कर सकता हूं() यह सही है?

----------------- संपादित करें 1 -----------------

मैं अपने कोड में रखते पहले से ही पहले

# set timezone 
date_default_timezone_set('Europe/Vienna'); 

# daylight-saving time 
if(date('I') < 1){ 
mysqli_query($db, "SET time_zone = '+01:00'"); 
}else{ 
mysqli_query($db, "SET time_zone = '+02:00'"); 
} 

----------------- संपादित 2 -----------------

ठीक है, मैं

xdate 
2017-01-01 
2017-01-15 
2017-01-31 
2017-02-01 
2017-02-15 
2017-02-28 
2017-03-01 
2017-03-15 
2017-03-31 
2017-04-01 
2017-04-15 
2017-04-30 
2017-05-01 
2017-05-15 
2017-05-31 
2017-06-01 
2017-06-15 

जनरेट किया गया आउटपुट मेरी स्क्रिप्ट से:

Current Time 
2017-06-16 02:31:08 PHP-Time 
2017-06-16 02:31:08 MySQL-Time 

Col 1  Col 2  Col 3  Col 4  Col 5  Col 6 
1483221600 2016-12-31 1483225200 2017-01-01 2017-01-01 2017-01-01 
1484431200 2017-01-14 1484434800 2017-01-15 2017-01-15 2017-01-15 
1485813600 2017-01-30 1485817200 2017-01-31 2017-01-31 2017-01-31 
1485900000 2017-01-31 1485903600 2017-02-01 2017-02-01 2017-02-01 
1487109600 2017-02-14 1487113200 2017-02-15 2017-02-15 2017-02-15 
1488232800 2017-02-27 1488236400 2017-02-28 2017-02-28 2017-02-28 
1488319200 2017-02-28 1488322800 2017-03-01 2017-03-01 2017-03-01 
1489528800 2017-03-14 1489532400 2017-03-15 2017-03-15 2017-03-15 
1490911200 2017-03-31 1490911200 2017-03-31 2017-03-31 2017-03-31 
1490997600 2017-04-01 1490997600 2017-04-01 2017-04-01 2017-04-01 
1492207200 2017-04-15 1492207200 2017-04-15 2017-04-15 2017-04-15 
1493503200 2017-04-30 1493503200 2017-04-30 2017-04-30 2017-04-30 
1493589600 2017-05-01 1493589600 2017-05-01 2017-05-01 2017-05-01 
1494799200 2017-05-15 1494799200 2017-05-15 2017-05-15 2017-05-15 
1496181600 2017-05-31 1496181600 2017-05-31 2017-05-31 2017-05-31 
1496268000 2017-06-01 1496268000 2017-06-01 2017-06-01 2017-06-01 
1497477600 2017-06-15 1497477600 2017-06-15 2017-06-15 2017-06-15 

वर्तमान समय में एक ही समय मेरे कम्प्यूटर पर दिखाया जाता है इस सामग्री (: "तिथि" फील्ड-प्रकार) के साथ एक MySQL-टेबल उत्पन्न। तो यह सही समय है और समय-सेटिंग्स ठीक लगती है। "वर्तमान समय" दिनांक() द्वारा उत्पन्न होता है - PHP में फ़ंक्शन और MySQLs के साथ अब()।

कर्नल 1 MySQL-क्वेरी का UNIX_TIMESTAMP है।

कर्नल 2 पीएचपी-तिथि-समारोह के साथ उत्पन्न तिथि है और कर्नल 1.

कर्नल 3 strtotime की यूनिक्स टाइमस्टैम्प() है।

कर्नल 4 पीएचपी-तिथि-समारोह और कर्नल 3.

कर्नल 5 के साथ उत्पन्न तिथि दिनांक DATE_FORMAT साथ स्वरूपित है (xdate, '% Y-% m-% d')।

कर्नल 6 सीधे डेटाबेस से दिनांक है।

date('d.m.Y', $mydate) 
: समारोह (2 कॉलम) जिसके साथ तंग आ गया है MySQL क्वेरी की UNIX_TIMESTAMP() -

आप देख सकते हैं, पहले आठ पंक्तियाँ गलत तारीख() द्वारा गणना कर रहे हैं (गलत?)

मैं परीक्षण किया है, क्या होता है अगर मैं

mysqli_query($db, "SET time_zone = '+01:00'"); 

तारीख-फ़ंक्शन giv के साथ लाइन

mysqli_query($db, "SET time_zone = '+02:00'"); 

की जगह सही तिथि वापस ले लें, लेकिन MySQL में अब() गलत समय को बचाता है।

जब मैं स्क्रिप्ट से सेटिंग (संपादित करें 1 देखें) के साथ हिस्से को हटाने, सब कुछ बराबर है, लेकिन फिर मैं गलत समय-क्षेत्र की है।

किसी को भी मेरे लिए एक सुराग है?

+0

है यह एक समय क्षेत्र समस्या/PHP और MySQL के बीच का अंतर है ग्रहण करने के लिए नहीं। – AbraCadaver

+0

मेरी सेटिंग फ़ाइल में हममम मैं पहले से ही डाल समय क्षेत्र-सेटिंग्स .. देखना मेरी edit1 – Bernhard

+2

@Bernhard, बेहतर समझने के लिए जहां यह गलती कर दी दो यूनिक्स टाइमस्टैम्प की तुलना करें। यदि वे वही हैं, तो समस्या समय क्षेत्र में है। यदि वे अलग हैं, सर्वर के समय अलग हैं। –

उत्तर

5

ठीक है, मेरी सेटिंग ठीक होने लगते हैं और यह, कि strtotime() हो रहा है PHP में MySQL में UNIX_TIMESTAMP के विरोध में समय क्षेत्र के साथ काम करता है। मैंने SELECTS को प्रतिस्थापित करने का निर्णय लिया जो UNIX_TIMESTAMP() एस का चयन करते हैं और इसे स्ट्रेटोटाइम() के साथ एक टाइमस्टैम्प में परिवर्तित करते हैं। अब यह काम करेगा क्योंकि यह काम करेगा।

2

घंटे और मिनट में शामिल करने के अपने प्रारूप का विस्तार करें, 1 आप 10 है कि आप UNIXTIME, जो जीएमटी है (इसके समय क्षेत्र के अनुसार) स्थानीय सर्वर तारीख की तुलना कर रहे हो जाता है और आप ग्रीनविच समय क्षेत्र पूर्व में स्थित हैं कि।

1

मैं 1 9 70 से सेकंड की संख्या के लिए मान्य प्रस्तुत दिनांक को फिर से समझने की आवश्यकता को कभी नहीं समझता। निश्चित रूप से बाद में इन सेकंड को एक पठनीय दिनांक-प्रस्तुति में सुधार किया जाता है।

` 
<?php 
$dtDate = new \DateTime('2017-03-01'); 
echo $dtDate->format('d.m.Y'); 
?> 
` 

लेकिन या तो मामले में, एक दोनों php और डेटाबेस सर्वर


समय क्षेत्र के लिए

की समय-क्षेत्र सेटिंग के बारे में पता होना चाहिए: DATETIME, समय क्षेत्र

निर्दिष्ट करके 2 पैरामीटर हो सकता है

और शुरुआती पोस्ट में दिखाए गए तिथियों के लिए: दिनांक 31-3-2017 2017 के दिन प्रकाश बचत समय (रविवार 26 मार्च से शुरू होने) की शुरुआत के बाद पहली तारीख थी इसके अलावा एक कारण हर दिन 24 * 60 * 60 सेकंड

+1

बिंदु एक मानक तारीख है जो निर्धारित नहीं है/एक विशिष्ट धार्मिक दृष्टिकोण का पक्ष नहीं है। लंदन में 1/1/1970 क्यों 2k + साल पहले एक शीतकालीन संक्रांति से भी बदतर है, जिसे ईसाई धर्म ने माना जाता है कि सालाना एक अलौकिक होने का जन्म मनाया जाता है? –