Magento custom module date field saving date to one day before the selected date

纵然是瞬间 提交于 2019-12-02 03:52:46

I stumbled on this post, while browsing for similar question about dates in Magento. Unfortunately, these answers didn’t help me, but I came back to share a couple of things about dates which I hope will be useful for someone else.

First of all, Magento stores dates in DB in UTC timezone. This way it requires the same code and same logic to display info for your customers in UK, US or AU. Check carefully, it saves it not "one day before", but 8 hours before (25 Jan, 2012 00:00:00 => 2012-01-26 16:00:00).

Second important thing: Magento provides standard dynamically generated getters and setters for database fields. So if you have added your custom fields to Product or Customer you don’t need to define your own methods to read/write to database. Your class, something like: class MyOrg_MyModule_Model_Customer extends Mage_Customer_Model_Customer will have methods $this->getStart_date() and $this->setStart_date($datetime) even for your custom fields. You also can use method $this-setData('start_date', $datetime); and then $this->save();

This information will help you understand what TimeZone parameters are required by standard Magento functions:

$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 );

For simplicity and speed, I suggest you to use timestamps for your date calculations and comparisons. And convert time in your timezone only in order to display it.

atif

Well amazing stuff happened !

i just removed the code from admin controller that was saving the dates fields and All good to go !!!

It saved the date automatically in the DB.

This may help many and save them time unlike me, i spent most of the time on it.

This is a really odd issue. This is what worked for me in a _filterDate function:

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

if the date is one day before the selected one try

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

set 'useTimezone' to False in

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

date($date = null, $part = null, $locale = null, $useTimezone = true)

Be sure, when you save date you do some like this

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

Then for getting correct timezone date use some like this

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

This solved my problem, don't know whether it is the right way to do it or not but i was more concerned about solving it

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);
}
Kaleem Ullah Khan

print_r() your data in controller and exit before saving it and look if you are still getting the right data before saving it. I never had this issue but it seems to be issue of your time zone.

AlexanderPop
$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
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!