ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 重复月度和年度事件 – 如何确保准确性?

2019-07-16 23:31:59  阅读:181  来源: 互联网

标签:php calendar strtotime recurring-events


我目前允许在我的日历应用上进行每日或每周重复活动(使用fullCalendar).

我的视图有一个复选框,可以激活两个下拉菜单:一个用于重复间隔(每天,每周),一个用于频率(一次,两次等).

$evt_interval_options = array( //this will be $row->interval in the model
    '86400' => 'Daily',   
    '604800' => 'Weekly'; 

$evt_frequency_options = array(  //this will be //$i in the model
    '1' => '2',    
    '2' => '3',    

<?php echo form_checkbox('evt_repeat', 'FALSE', FALSE, 'class="repeat_checkbox"'); 
      echo form_dropdown('evt_interval', $evt_interval_options');
      echo form_dropdown('evt_frequency', $evt_frequency_options'); ?>

这最终到达我的模型,它运行循环检查事件是否应重复 – 如果是,它将考虑间隔($row-> interval)和频率($i).

$cal_data[] = array(
    'start' => strtotime($row->date_1 . ' ' . $row->time_1) + ($i ? ($row->interval * $i) : 0),
);

这很好地基于数据库中的单个记录条目显示多个每日或每周事件.

问题是每月和每年.因为这些将具有可变的秒数

03/01/2011 00:00:00 --> 04/01/2011 00:00:00 ===> 2674800 seconds
04/01/2011 00:00:00 --> 05/01/2011 00:00:00 ===> 2592000 seconds
and so on for monthly and yearly differences

那么我该如何解决这个问题呢?是否有任何函数或strtotime命令可以帮助准确地指示每月应重复例如4月或者每年应该在7月4日重复一次?

我使用的是PHP 5.2.14.

解决方法:

感谢所有回答 – 我通过@akniep从PHP.net manual on strtotime()解决了这个功能的问题.

function get_x_months_to_the_future( $base_time = null, $months = 1 )
{
    if (is_null($base_time))
        $base_time = time();

    $x_months_to_the_future    = strtotime( "+" . $months . " months", $base_time );

    $month_before              = (int) date( "m", $base_time ) + 12 * (int) date( "Y", $base_time );
    $month_after               = (int) date( "m", $x_months_to_the_future ) + 12 * (int) date( "Y", $x_months_to_the_future );

    if ($month_after > $months + $month_before)
        $x_months_to_the_future = strtotime( date("Ym01His", $x_months_to_the_future) . " -1 day" );

    return $x_months_to_the_future;
}

这样做可以解决第29,30,31天以及2月28日每月重复发生的事件.

我喜欢这个功能,因为它解决了日历应用程序POV中的问题.

如果用户请求从1月31日开始的每月重复活动,则正常的strtotime将在2月和任何其他没有31天的月份内表现不正常.

正如我在上面的评论中所指出的那样,谷歌日历通过跳过几个没有这样日期的月份来解决这个问题.

我想这是一个偏好的问题,但对我而言,提供定期事件在本月的最后一天更有意义 – 所以在1月31日的例子中,定期发生的事件将发生在2月28日3月31日3月30日,依此类推.

我将此函数放在一个循环中,该循环迭代用户请求的重复次数并且它完美地工作.它也适用于年度活动,因为我只用了12个月的数量.

标签:php,calendar,strtotime,recurring-events
来源: https://codeday.me/bug/20190716/1482936.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有