2013-03-31 3 views
1

Это на самом деле следующий вопрос От this question, но он представляет собой совершенно другую проблему. Я также знаю, что это довольно запутанно, поэтому, пожалуйста, несите меня.PHP форматирование времени путаницы

У меня есть дата, которая представляет как: 1/04/2013, который предназначен, чтобы быть Jan 04 2013

В упомянутом выше вопрос, я должен был случайно добавить часы и минуты в формате времени, и он работает для того, что это было должен делать:

$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date)); 

это произвело что-то вроде: 2013-05-01 08:57:00

проблема заключается в том, что теперь система видеть эту дату в качестве MAY 1st, а не JAN 05 ..

когда я автоматически вставлять эти сообщения (WP) - все сообщения, которые будут иметь дату, как 2012-05-28 будет вставлен в БД, как 1970-01-01 (я предполагаю, что это формат по умолчанию «неправильная дата» для PHP. . двадцать восьмой месяц ошибка конечно ..)

Я попытался изменить день месяца с

$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date)); 

в

$clr_datenew = date('Y-d-m ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date)); 

Но он производит ту же ошибку с разными комбинациями дат.

После того, как коллега дал мне совет, что:

StrToTime интерпретирует х/у/г, как мм/дд/гг [гг], и хуг, как дд-мм-гггг или уу-мм- дд, в зависимости от того, г состоит из 4 цифр или 2.

Я также попытался:

date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime(str_replace('/','-',$clr_date))); 

Я действительно теряя свой ум здесь :-)

Я предполагаю, что это потому, что я использую strtotime(), где функция фактически «угадывает», как отформатировать мое время на основе слабого «человеческого» формата.

Есть функция, чтобы преобразовать даты из одной даты в другую, указав как исходный формат даты, так и желаемый формат преобразования?

dummy_function($origformat,$wantedformat) что-то вроде, где я могу указать dummy_function('Y-d-m','Y-m-d')

EDIT Я После прочтения комментария по @harke что-то вызвало у меня и комбинируя его с ответом на @ Maks3w оказывается, что формат, который работает меня:

$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime(str_replace('/','-',$clr_date))); 

Я не мог проверить РНР 5.3+ методы, поскольку они не столь актуальна для меня, как (внутренний) сервер в той или иной компании работает более низкую версию ..

немного дополнительного что-то, что должно быть размещены на каждой афише БД дизайнеров/программистов: http://xkcd.com/1179/

То есть - до дальнейшего уведомления :-)

+0

Вы взглянули через список доступных функций даты? http://www.php.net/manual/en/ref.datetime.php – deceze

+1

@deceze - конечно, у меня есть, и я также много пробовал, но, как я уже сказал, меня немного смутили все эти преобразование в формате времени. Отсюда и вопрос. –

+1

Вам необходимо указать, какой формат даты использовать для ввода сообщения. Только когда вы точно знаете, вы можете легко написать параметр формата date(). Прямо сейчас создаваемое форматирование задается ISO 8601 как для первой части (Дата календаря как ГГГГ-ММ-ДД), так и для второй части по отдельности (Время как hh: mm: ss). Однако полученный формат не является действительной комбинацией даты и времени ISO 8601, для которой вместо буквы пробегает буква «T». Хотя формат, который вы используете, является общим. Однако это неверно, поскольку это похоже на то, что вы пишете в своем вопросе. – hakre

ответ

1

Первый аргумент date() является маска формата для печати литералы вы должны экранировать каждый символ обратной косой черты \

$clr_datenew = date('Y-m-d ' . preg_replace('/(.)/', '\\\$1', sprintf('\%d\%d\:\%d\%d\:00', mt_rand(0, 23), mt_rand(0, 59))), strtotime($date)); 
+0

Спасибо .. ваше решение действительно работало во времена, когда ДЕНЬ был меньше, чем '9'. на тех, кто больше 10, он снова терпел неудачу. –

+0

спасибо, кажется, что это было частью решения. читать редактировать I –

1
  1. De cide на один представление внутреннего времени и придерживаться его. Предпочтительно выбрать один, который является стандартом для многих систем. m/d/yне такой стандарт (несмотря на то, что многим американцам нравится думать; P). Практически универсальный стандарт - Y-m-d H:i:s (обозначается как строка формата для функции date()). Большинство баз данных ожидают этого формата, все связанные со временем функции могут анализировать этот формат без двусмысленности.

  2. выше является полезным текстовое представление на дату, которая взаимозаменяемы между различными системами, но внутренне имеет смысл представлять дату в еще более гибкий тип: а UNIX timestamp или DateTime object. Выберите тот или другой и сохраните все свои даты внутри вашего кода в этом формате. Оба позволяют легко манипуляции значений времени. Только измените его на строку, когда вам нужно отобразить дату для пользователя, или вам нужно отправить ее в виде строки в другую систему (т. Е. Вставить в базу данных). Не конвертируйте между m/d/y строками в отметки времени UNIX до d/m/y строк.

  3. Чтобы разобрать дату в известном формате в метку времени UNIX или DateTime объекта отформатировать его в чем-то еще позже, использовать DateTime::createFromFormat на последних версиях PHP (5.3+) или старше strptime следуют некоторые ручной сборки.

+0

Спасибо за ваш совет ..что касается 1-го пункта - формат НЕ был выбран мной, я вставляю данные от третьего лица - и я, безусловно, НЕ американский. объедините это с ЭТО, и вы увидите настоящую проблему. что касается второго и третьего пунктов - мне не нужно представлять дату, мне просто нужно вставить в DB.anyhow, похоже, что мое решение было более простым, чем прогнозировалось –

1
$date=date_format(date_create($clr_datenew), 'Y-m-d H:i:s');