Как мне сохранить дату в PHP для использования с javascript?

Что я хочу сделать, так это заставить скрипт на сервере читать текстовый файл, сортировать его, а затем выводить в объект javascript (возможно, через JSON). Рассматриваемый текстовый файл выглядит примерно так:

13/09/2009,17/09/2009,Arbitrary dates
14/09/2009,18/09/2009,Some random comment
14/09/2010,18/12/2010,A comment to the dates
14/09/2010,18/09/2010,A subset of another date
14/09/2001,18/09/2002,The oldest date

PHP для обработки чтения файлов выглядит так:

function loadDates()
{
    $dateFile = fopen("dates.txt", "rt");
    $dates = array();
    if($dateFile)
    {
        flock($dateFile,LOCK_SH);
        $i = 0;

        while(!feof($dateFile))
        {
            $text = fgets($dateFile);
            if($text !== FALSE)
            {
                $i++;
                $arr = explode(",",$text,3);
                //actual storage
                $dates[$i]['start']   = strtotime($arr[0]);
                $dates[$i]['end']     = strtotime($arr[1]);
                $dates[$i]['comment'] = $arr[2];
            }
        }
        fclose($dateFile);

        //sort by start date, then by end date
        foreach($dates as $key => $item)
        {
            $start[$key]  = $item['start'];
            $end[$key] = $item['end'];
        }
        array_multisort($start, SORT_ASC, $end, SORT_ASC, $dates);
        return $dates;
    }
    else
    {
        return FALSE;
    }
}

Однако при этом сохраняются временные метки unix в датах начала и окончания. Я бы использовал класс DateTime, но в настоящее время я ограничен PHP 4.4. В идеале я хотел бы хранить даты в формате, который:

  1. Можно сравнить численно
  2. Удобны для чтения человеком (позволяют редактировать dates.txt человеку)
  3. Последовательно отформатированы (т.е. "01-01-1900" преобразуется в "01/01/1900")
  4. Может быть преобразован в объект даты javascript.

Как мне хранить даты, чтобы они соответствовали этим ограничениям?


person Eric    schedule 13.09.2009    source источник


Ответы (2)


Безопаснее всего использовать временные метки UNIX.

в javascript вы можете использовать

var mydate = new Date();
mydate.getTime(); //timestamp
mydate.setTime(your_timestamp); //set using timestamp

в php функция даты принимает метку времени в качестве второго параметра.

см. http://jp.php.net/manual/en/function.date.php и https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date

EDIT:
См. также strftime http://jp.php.net/manual/en/function.strftime.php

EDIT:
Примечание: функция javascript занимает миллисекунды, а функции php используют секунды. разделите вывод javascript на 1000 или используйте что-то вроде следующего:

Date.prototype.getTimeInSeconds = function() {
    return this.getTime()/1000;
}

var mydate = new Date();
mydate.getTimeInSeconds(); //PHP-compatible timestamp
person Jonathan Fingland    schedule 13.09.2009
comment
Вы забыли умножить/поделить на 1000. - person Robert L; 14.09.2009

Сохраните даты таким образом:

19991231 = 31 декабря 1999 г.

20000704 = 4 июля 2000 г.

Человекочитаемый, определенно сортируемый, и вы можете сделать функцию JavaScript для преобразования.

Я предоставлю вам хак из моего ненормального разума:

(предполагается, что x — это дата в формате ггггммдд)

new Date((x-(x%10000))%9999,(((x%10000)-(x%100))%99)-1,x%100)
person Robert L    schedule 13.09.2009