Как преобразовать дату из строки в timestamp?

91
12 октября 2021, 17:40

Есть массив таких строк:
10 янв 2016
04 фев 2017
15 апр 2017
...
Как их преобразовать с помощью php в mysql формат timestamp в цикле?

Answer 1

С помощью функции strtotime предварительно заменив русские слова на английские.

$ru_dates = [
    '10 янв 2016',
    '04 фев 2017',
    '15 апр 2017'
];
$ru_months = array( 'янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек' );
$en_months = array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
$timestamps = [];
foreach($ru_dates as $ru_date){
    $en_date = str_replace( $ru_months, $en_months, $ru_date );
    $timestamps[] = strtotime($en_date);
}
echo '<pre>';
print_r($timestamps);
Answer 2

Если поле в MySQL имеет тип timestamp, то при вставке/изменении этого поля Вы используете строку. MySQL сам преобразует корректную строку в timestamp, используя для преобразования выставленную временную зону соединения (не забудьте ее установить).

Дату же к общепринятому формату можно привести с помощью функции strptime(), предварительно установив русскую локаль (если текущая локаль уже русская, что вполне возможно - как-то же сформировались в массиве русские названия месяцев, seltocale() можно опустить).

Код будет примерно таким

try {
    $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1',
                   'dbuser',
                   'dbpass',
                   [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES "utf8"']);
} catch (PDOException $e) {
    echo 'Подключение не удалось: ' . $e->getMessage();
    exit(1);
}
// Совместить текущую временную зону скрипта с временной зоной соединения с MySQL
$dbh->exec('SET time_zone = "' . date('P') . '"');
$oldLocale = setlocale(LC_TIME, 'ru_RU');
foreach ($dates as $datestring) {
    $parsed = strptime($datestring, '%d %b %Y');
    $formattedDate = (1900 + $parsed["tm_year"]) . '-' .
                     (1 + $parsed["tm_mon"]) . '-' . $parsed["tm_mday"];
    $dbh->exec("INSERT INTO table (datetimefield) VALUES ('$formattedDate')");
}
setlocale(LC_TIME, $oldLocale);
READ ALSO
Как сделать код проще

Как сделать код проще

Есть текстовый файлик

148
PHP кукиес не работают. Можно удалить php?

PHP кукиес не работают. Можно удалить php?

Не работают куки в PHP, имеем массив со всеми переводами текста: $local ассоциативный массив в котором ещё массивы выглядит это всё примерно так

121
Приём платежей на сайте без агрегата

Приём платежей на сайте без агрегата

Ребята ,кто знает по какому принципу устроена приём платежей на сайте без сторонних агрегатов типо робокасса и тд

98