2012-01-25 19 views
1

は、私は私のカスタムモジュールに日付フィールドを追加するには、このリンク上の手順に従っ私は日付を選択して設定を保存するとき、それは選択された一つ前の日一日を私に返し:(Magentoのカスタムモジュールの日付フィールドには、選択した日付の前日までの日付を保存

例えば:

私は2月25日、20を選択すると、 12とは、2012年

お知らせは、それは私がますprint_r管理コントローラで($モデル)前に保存したときに私はこれを取得:(

1日前に保存され、それが保存されます、保存して2月24日を返します。

[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 

注:

私は投稿日をエコー、それが正しかった私投稿データに問題がないことを意味するように設定されている場合は、 のクライアント側にはバグがないので、問題がどこにあるのかはデータベースに保存するように変換されます。任意のヘルプ???

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 オリジナルの投稿日をここで

は私が試した私のinitiallコードです:01/27/12 $ dateエコー結果:2012年1月26日4:00:00

+0

値がフォームから正しく送信されているかどうかを確認しましたか?コントローラーの操作に達すると正しいのですか?そうでなければ、クライアント側の問題があります。正しく提出された場合: 'print_r'の直前に' echo date_default_timezone_get(); 'とは何か?私はそれをエコー –

+0

そのUTC :) – atif

答えて

1

のようないくつかを使用する驚くべきものが起こりました!

私はちょうどで、日付フィールドを保存していた管理コントローラからコードを削除しましたとすべていいですよ!

DBに自動的に日付を保存しました。

これは多くの人に役立ち、私と違って時間を節約することができます。ほとんどの時間を費やしました。

+0

は、それはローカルで行われますが、ライブサイトでは、2011年11月31日を節約した:(なぜ?? – atif

0

print_r()あなたのデータをコントローラに保存して保存しておいてください。保存する前に正しいデータが得られているかどうか確認してください。私はこの問題を抱えたことはありませんでしたが、それはあなたのタイムゾーンの問題であるようです。あなたはこの

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

のようなあなたには、いくつかの操作を行う日付を保存するとき

0

は、必ず正しいタイムゾーンの日付を取得するためのさて、この

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

これははそれが右のそれを行う方法かであるかどうかわからないが、選択の前に日付が1日の場合、私はそれを

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

日付($ date = null、$ part = null、$ locale = null、$ useTimezone = true)

+0

が、私はそれをしようとすると、ここで – atif

+0

を返信を掲示することで、このソリューションは私のために働いていただきありがとうございます – balrok

2

これは本当に奇妙な問題です。これは_filterDate機能に私のために働いていたものです:

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

Magentoの内の日付について同様の質問をブラウズしながら、私は、この記事につまずきました。残念ながら、これらの答えは私を助けませんでしたが、私は他の誰かに役立つことを願っている日付についていくつかのことを共有するために戻ってきました。

まず、MagentoはUTCのタイムゾーンでDBに日付を格納します。このようにして、英国、米国またはAUのお客様の情報を表示するには、同じコードと同じロジックが必要です。 「1日前」ではなく、8時間前(2012年1月25日00:00:00 => 2012-01-26 16:00:00)に保存してください。

第二に重要なこと:Magentoのは、データベースフィールドのための標準的な動的に生成されたゲッターとセッターを提供します。したがって、カスタムフィールドをProductまたはCustomerに追加した場合、独自のメソッドを定義してデータベースを読み書きする必要はありません。あなたのクラスのようなもの:class MyOrg_MyModule_Model_Customer extends Mage_Customer_Model_Customerは、カスタムフィールドでも$this->getStart_date()$this->setStart_date($datetime)のメソッドを持っています。また、この情報は、パラメータは標準Magentoの機能によって必要とされるどのようなタイムゾーンを理解するのに役立ちます

方法 $this-setData('start_date', $datetime);を使用して、 $this->save();ことができます。

$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

これは疑問に答えるかもしれませんが、答えの本質的な部分を説明し、おそらくOPコードの問題点を説明する方が良いでしょう。 – pirho

関連する問題