Пользовательский модуль Magento сохраняет поле даты за один день до выбранной даты - PullRequest
1 голос
/ 25 января 2012

Я следовал инструкциям по этой ссылке, чтобы добавить поле даты в свой пользовательский модуль:

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

Все прошло хорошо, за исключением того, что когда я выбираю дату и сохраняю конфигурации, он возвращает мне дату за один день до выбранного: (

Например:

Когда я выбираю 25 февраля , 2012 и сохраняю, он сохраняет и возвращает 24 февраля , 2012.

Обратите внимание, что он был сохранен за день до этого: (

я получаю это, когда я print_r ($ model) в административном контроллере раньшесохранить:

[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 оригинальная дата публикации: 01 /27/12$ эхо-результат: 26 января 2012 г., 16:00

Ответы [ 8 ]

3 голосов
/ 12 декабря 2013

Я наткнулся на этот пост, просматривая аналогичный вопрос о датах в Magento. К сожалению, эти ответы не помогли мне, но я вернулся, чтобы поделиться несколькими вещами о датах, которые, я надеюсь, будут полезны для кого-то еще.

Прежде всего, Magento хранит даты в БД в часовом поясе UTC. Таким образом, требуется один и тот же код и та же логика для отображения информации для ваших клиентов в Великобритании, США или Австралии. Проверьте внимательно, он сохраняет его не «за день до», а за 8 часов до (25 января 2012 года 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) даже для ваших пользовательских полей. Вы также можете использовать метод $this-setData('start_date', $datetime);, а затем $this->save();

Эта информация поможет вам понять, какие параметры TimeZone требуются стандартными функциями 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 );

Для простоты и скорости я предлагаю вам использовать временные метки для расчета и сравнения дат. И конвертировать время в вашем часовом поясе только для того, чтобы отобразить его.

2 голосов
/ 06 февраля 2013

Это действительно странная проблема. Вот что сработало для меня в функции _filterDate:

$value = date('Y-m-d', strtotime($value . ' + 1 days'));
2 голосов
/ 26 января 2012

Ну, удивительные вещи произошли!

я просто удалил код из контроллера администратора, который сохранял поля дат и все в порядке !!!

Он автоматически сохранил дату в БД.

Это может помочь многим и сэкономить им время, в отличие от меня, я провел большую часть времени на этом.

1 голос
/ 01 сентября 2012

, если дата за один день до выбранной, попробуйте

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

установите для 'useTimezone' значение False в

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

дата ($ date = ноль, $ part = ноль, $ locale = ноль, $ useTimezone = true)

0 голосов
/ 08 декабря 2017
$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 голосов
/ 08 февраля 2012

Это решило мою проблему, не знаю, правильно ли это сделать или нет , но меня больше волновало решение этой проблемы

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);
}
0 голосов
/ 25 января 2012

Убедитесь, что когда вы сохраняете дату, вы делаете что-то вроде этого

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

Тогда для получения правильной даты часового пояса используйте что-то вроде этого

$dt = $this->getData('created_at');
$time = $this->_getResource()->mktime($dt);
if ($time) {
    $dt = Mage::app()->getLocale()->date($time, null, null, true);
}
0 голосов
/ 25 января 2012

print_r() ваши данные в контроллере и выход перед сохранением и посмотрите, получаете ли вы по-прежнему правильные данные перед сохранением.У меня никогда не было этой проблемы, но, похоже, проблема вашего часового пояса.

...