2012-01-25 73 views
1

我跟着這個鏈接步驟的日期字段添加到我的自定義模塊:Magento的自定義模塊日期字段保存日期一天選定日期之前

http://magentomechanic.blogspot.com/2010/01/to-add-custom-date-field-in-custom.html

一切正常,除了那當我選擇日期和保存配置,它返回我日期的前一天所選擇的一個:(

例如:

當我選擇25二月,20 12和保存,將保存並返回2月24日,2012年

通知之前:(

我得到這個當我的print_r在管理控制器($模型)之前保存保存第一天:

[start_date] => 2012-01-24 16:00:00 // i set it to 25 but its saving 24 
[end_date] => 2012-01-26 16:00:00 // i set it to 27 but ..... 
[status] => 1 [content] => asdasdadsd 
[created_time] => 2012-01-25 07:27:11 // it gives current date and it is O'rite 
[update_time] => 2012-01-25 07:27:11) //it gives current date and it is O'rite 

注:

我呼應發佈日期,這是正確的我設置爲意味着發佈數據沒有問題, 意味着客戶端對於任何錯誤都是明確的,所以問題出在哪裏是什麼時候它被轉換爲保存在數據庫中!任何幫助?

這裏是我的initiall代碼我想:

if($data['start_date'] != NULL) 
       { 
       $date = Mage::app()->getLocale()->date($data['start_date'], Zend_Date::DATE_SHORT); 
       $model->setStartDate($date->toString('YYYY-MM-dd HH:mm:ss')); 
       } 
       if($data['end_date'] != NULL) 
       { 
       $date1 = Mage::app()->getLocale()->date($data['end_date'], Zend_Date::DATE_SHORT); 
       $model->setEndDate($date1->toString('YYYY-MM-dd HH:mm:ss')); 
       } 

那麼我想這一個:

echo $format = Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT).'<br/>'; 
       if($data['start_date'] != NULL) 
       { 
        echo $data['start_date']."<br/>"; // 01/27/12 correct date posted which i entered 
        $date = Mage::app()->getLocale()->date($data['start_date'], $format); 
        echo $date; /// Jan 26, 2012 4:00:00 PM but here we get back to one day 
        $time = $date->getTimestamp(); 
        $model->setStartDate(Mage::getSingleton('core/date')->date(null, $time)); 

        //$model->setStartDate($date->toString('YYYY-MM-dd HH:mm:ss')); 
       } 
       if($data['end_date'] != NULL) 
       { 
        echo $data['end_date'].'<br/>'; 
        $date1 = Mage::app()->getLocale()->date($data['end_date'], $format); 

        $time = $date1->getTimestamp(); 
        $model->setEndDate(Mage::getSingleton('core/date')->date(null, $time)); 

        //$model->setEndDate($date1->toString('YYYY-MM-dd HH:mm:ss')); 
       } 

$格式相呼應:M/d/yy的 原貼日期:01/27/12 $ date回覆結果:2012年1月26日4:00:00

+0

您是否檢查過表單中的值是否正確提交?在達到控制器操作時它們是否正確?如果不是的話,你會遇到客戶端問題。如果他們被正確提交:在你的'print_r'給出之前'echo date_default_timezone_get();'是什麼? –

+0

它的UTC時,我呼應它:) – atif

回答

1

好大放異彩做一些這樣的

$dt = $this->getResource()->formatDate(time()); 
$this->setData('created_at', $dt); // current model 

呢!

我只是從管理員控制器刪除了代碼保存日期字段和所有好去!!!

它將日期自動保存在數據庫中。

這可能會幫助很多人,並節省他們不像我的時間,我花了大部分時間。

+0

它是在本地完成,但在現場,它節省了2011年11月31日:(爲什麼是這樣?? – atif

0

print_r()控制器中的數據並在保存之前退出並查看在保存之前是否仍然獲取正確的數據。我從來沒有這個問題,但它似乎是你的時區的問題。

0

可以肯定,當您保存日期您獲得正確的時區日期使用一些像這樣發生

$dt = $this->getData('created_at'); 
$time = $this->_getResource()->mktime($dt); 
if ($time) { 
    $dt = Mage::app()->getLocale()->date($time, null, null, true); 
} 
0

這解決了我的問題,不知道是否是做或不以正確的方式,但我更關心的是解決它

if($data['start_date'] != NULL) 
{ 
$start_time_array = explode("/", $data['start_date']); 
$start_time = $start_time_array[2]."-".$start_time_array[0]."-".$start_time_array[1]." 00:00:00"; 
$model->setStartDate($start_time); 
} 
1

如果日期是選擇的前一天一個嘗試

Mage::app()->getLocale()->date($data['start_date'], Zend_Date::DATE_SHORT, null, false); 

集 'useTimezone' 爲False

/app/code/core/Mage/Core/Model/Locale.php

日期($日期= NULL,$部分= NULL,$區域= NULL,$ useTimezone = TRUE)

+0

我會嘗試它,並會在這裏發佈回覆 – atif

+0

謝謝你這個解決方案爲我工作 – balrok

2

這是一個非常奇怪的問題。這是我在一個_filterDate功能什麼工作:

$value = date('Y-m-d', strtotime($value . ' + 1 days')); 
3

我無意中發現這個帖子,一邊瀏覽有關Magento的日期類似的問題。不幸的是,這些答案並沒有幫助我,但我回來分享了一些關於日期的事情,我希望對其他人有用。

首先,Magento以UTC時區的數據庫存儲日期。這樣,它需要相同的代碼和相同的邏輯才能在英國,美國或非洲地區爲您的客戶顯示信息。 仔細檢查,不是「前一天」,而是8小時前(2012年1月25日00:00:00 => 2012-01-26 16:00:00)。

第二件重要的事情:Magento爲數據庫字段提供了標準的動態生成的getter和setter。因此,如果您已將自定義字段添加到產品或客戶,則無需定義自己的方法來讀取/寫入數據庫。你的班級,如:class MyOrg_MyModule_Model_Customer extends Mage_Customer_Model_Customer將有方法$this->getStart_date()$this->setStart_date($datetime)即使您的自定義字段。您還可以使用方法$this-setData('start_date', $datetime);然後$this->save();

這些信息將幫助您瞭解通過標準Magento的功能需要什麼時區的參數:

$current_datetime_utc_in_timestamp_format = time(); 

$start_datetime_utc_in_text_format = $this->getStart_date(); 
$start_datetime_utc_in_timestamp_format = Varien_Date::toTimestamp($start_datetime_utc_in_text_format); 

//check Mage/Core/Model/Date.php 
// timestamp() adds TimeZone to datetime, see also gmtTimestamp() – it deducts TimeZone from datetime 
$start_datetime_local_in_timestamp_format = Mage::getModel('core/date')->timestamp($start_datetime_utc_in_text_format)); 
//Timestamp() also accepts parameter in timestamp format 
$start_datetime_local_in_timestamp_format = Mage::getModel('core/date')->timestamp($current_datetime_utc_in_timestamp_format)); 

$displayTime = true; 
$start_datetime_local_in_text_format = Mage::helper('core')->formatDate($start_datetime_utc_in_text_format, 'medium', $displayTime); 
//or 
$start_datetime_local_in_text_format = Mage::getModel('core/date')->date("Y-m-d H:i:s", $start_datetime_utc_in_timestamp_format); 

$start_datetime_utc_in_text_format = Mage::getModel('core/date')->gmtdate("Y-m-d H:i:s", $start_datetime_local_in_timestamp_format); 
//similar to timestamp()/gmtTimestamp(), date() – adds TimeZone and gmtDate() – deducts TimeZone from time 

$this->setStart_date($start_datetime_utc_in_timestamp_format); 

爲了簡化和速度,我建議你使用時間戳的日期計算和比較。並只在您的時區轉換時間才能顯示它。

0
$preSaleDate = $_product->getAvailabilityDate();//product attribute 

if($preSaleDate) { 
    $format = 'Y-m-d H:i:s'; //current format 
    $formatted_date = DateTime::createFromFormat($format, $preSaleDate)->format('m/d/Y'); 
    $dateReal = Mage::app()->getLocale()->date($formatted_date 
                ,Zend_Date::DATE_SHORT, null, false); 
    $format = 'long'; // short, long, medium, full 
    $dueDate = Mage::helper('core')->formatDate($dateReal, $format, false); 

    echo $dueDate;// will get same day as original $preSaleDate 
} 
+0

雖然這可能會回答這個問題,但最好解釋答案的重要部分,以及OPs代碼可能存在的問題。 – pirho

相關問題