1

我正在构建一个要求允许用户存储时间表的 CMS。该界面类似于 MS Outlook,因此重复计划几乎需要模仿该 UI 可以支持的内容。

保存计划后,我们需要以某种方式在应该发生事件时收到警报。目前,计划是每分钟运行一次 cron 作业,以检查并查看是否在那一分钟安排了事件。

由于我们的用户将来自世界各地,因此我们需要这个调度系统能够识别时区和 DST。

此外,能够将此时间表转换为人类可读的文本(例如,“从 2010 年 1 月 1 日到 2010 年 2 月 1 日,每天早上 9 点”)对我们的用户来说非常有用。

有谁知道如何实现这一点?我正在使用 PHP/MySQL。

4

2 回答 2

1

查看iCalendar规范,了解可以指定的内容...

于 2010-02-10T18:35:37.067 回答
1

您的问题看起来更像是一个职位发布到工作委员会,要求某人为您编写您的应用程序。

它真的没有那么复杂,你想要做什么。只需设置一个 MySQL 表来存储 appts,可能包括名称、描述、开始时间戳、结束时间戳和“重复”布尔值。使用 Ajax 查询数据库,在您喜欢的任何时间间隔内查看是否有任何即将到来的约会。如果为真,则通知用户。

对于时间格式,您可以执行以下操作:

function format_date($timestamp1, $timestamp2,$repeating) {
    $str = "";
    if($repeating) {
        $str .= "Every Day";
    }
    $str .= "From ".date("g:i a",$timestamp1)." To ".date("g:i a",$timestamp2);
    return ($str);
}

以下是您可以查看的一些查询和一些表创建 SQL:

CREATE TABLE `appointments` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `description` text,
    `recurring` int(11) DEFAULT NULL,
    `recurrence_type` varchar(50) DEFAULT NULL,
    `starting_timestamp` int(14) DEFAULT NULL,
    `ending_timestamp` int(14) DEFAULT NULL,
    `end_recurring_timestamp` int(14) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

mysql_query("SELECT * FROM appointments 
WHERE recurring=0 
AND starting_timestamp <= ". time() + 86400 ." 
AND starting_timestamp > ". time() ." 
ORDER BY starting_timestamp DESC");

mysql_query("SELECT * FROM appointments 
WHERE recurring=1 
AND recurrence_type='DAILY' 
AND starting_timestamp <= ". time() + 86400 ." 
AND end_recurring_timestamp > ". time() ." 
ORDER BY starting_timestamp DESC");

每周和每月的重复将更加复杂,并且可能需要在 SQL 查询之外进行操作。这可能意味着更高的开销。

对于此示例,我将日期存储为时间戳。但是,将它们存储为字符串并使用 strtotime() 之类的东西可能更合理。虽然,我不知道该功能有多可靠。

你可以明白的。至于时区支持,请查看http://www.ultramegatech.com/blog/2009/04/working-with-time-zones-in-php/http://www.php.net/manual/en/类.datetimezone.php

于 2010-02-10T18:45:25.800 回答