草庐IT

php - Zend_Date : How to get the date of an upcoming day?

coder 2024-04-14 原文

我想获得最近的星期一的日期(即不是过去的)。

因此,如果今天是星期二(2009 年 12 月 1 日),我想获取星期一(2009 年 12 月 7 日)的日期。

我如何用 Zend_Date 做到这一点?

解决方案:

假设今天是星期二,我们想要获得即将到来的星期一。星期一是 future 6 天。因此,我们将添加 6 天以获得星期一的日期。

//like so:
$tuesday = Zend_Date::now();
$nextMonday = $tuesday->addDay(6);

要动态地执行此操作,我们需要确定今天是星期几:

$today = Zend_Date::now();
$dayNumber = $today->get(Zend_Date::WEEKDAY_DIGIT);
//dayNumber will now be equal to the numeric day of the week (0-6)
//example:
$weekdays = array(
    0 => 'sunday',
    1 => 'monday',
    2 => 'tuesday' //etc...
);

要确定我们需要添加多少天才能获得所需的 future 日期,我们执行以下操作:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 );
#      $dayWanted = monday(1)
# $todayDayNumber = tuesday(2)
#               7 = number of days in a week (we don't want a negative number)
#       1 - 2 + 7 = 6 days into the future
$nextMonday = $today->addDay($daysToAdd);

假设我们想要的那一天是星期三(明天), future 的一天。我们以前的解决方案将不起作用:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 );
#      $dayWanted = wednesday(3)
# $todayDayNumber = tuesday(2)
#               7 = number of days in a week
#       3 - 2 + 7 = 8 days into the future (not 1)

我们可以通过添加 modulus operator 来解决这个问题(百分号)添加到我们的公式中以获得除法运算的余数。

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 ) % 7;
# (3 - 2 + 7) % 7
# $daysToAdd == 1 (remainder of 8 divided by 7)
$tomorrow = $today->addDay($daysToAdd);

现在我们的公式将按预期工作......除了一件事。如果今天是星期二,我想得到下星期二,我们的公式将在今天返回,而不是从今天开始的一周:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 ) % 7;
# (2 - 2 + 7) % 7 == 0
# 7 goes into 7 evenly with no remainder

我们必须添加一个检查以确保它不等于零。

if ($daysToAdd == 0) {
    //give me the date a week from today, not today's date
    $daysToAdd = 7;
}

最终解决方案:

public function outputDate()
{
    $monday = $this->getDateOfNext('monday');
    echo 'today: ' . Zend_Date::now()->toString(Zend_Date::RFC_850) . "<br>";
    echo "monday: " . $monday->toString(Zend_Date::RFC_850);
}

private function getDateOfNext($dayWanted)
{
    $weekdays = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
    if (!in_array($dayWanted, $weekdays)) {
        throw new Exception("'$dayWanted' not found in array of possible weekdays");
    }
    $weekdays = array_flip($weekdays);
    $date = Zend_Date::now();
    $today = $date->get(Zend_Date::WEEKDAY_DIGIT);
    $daysToAdd = ( $weekdays[$dayWanted] - $today + 7 ) % 7;
    if ($daysToAdd == 0) {
        //give me the date a week from today, not today's date
        $daysToAdd = 7;
    }
    $date->addDay($daysToAdd);
    return $date;
}

最佳答案

逻辑如下:

$days_per_week = 7;
$weekdays = array_flip(array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'));

$day_wanted = 'mon';
$days_forward =
  ( $weekdays[$day_wanted] - $date->get(Zend_Date::WEEKDAY_DIGIT) + $days_per_week )
  % $days_per_week;

$date->addDay($days_forward);

这适用于任何 $day_wanted

关于php - Zend_Date : How to get the date of an upcoming day?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931349/

有关php - Zend_Date : How to get the date of an upcoming day?的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby - Rails 3 - 我可以将开始日期设置为 date_select 方法吗? - 2

    date_select方法只能设置:start_year,但我想设置开始日期(例如3个月前的日期)(但没有这样的选项)。那么,我可以将开始日期设置为date_select方法吗?或者,要制作这样的选择框,我应该使用select_tag和options_for_select吗?或者,有什么解决办法吗?谢谢, 最佳答案 有可能……例如:start_year–设置年份选择的开始年份。默认为Time.now.year-5参见thisresource. 关于ruby-Rails3-我可以将开始日期

  3. ruby - Date 与 nil 的比较失败 - ruby - 2

    我正在运行这样的代码:ifvalid_from>Date.today当我运行它时,我得到一个错误提示comparisonofDatewithnilfailed我假设它正在发生,因为在某些情况下valid_from是nil。有没有办法避免出现此错误? 最佳答案 你可以这样做:ifvalid_fromandvalid_from>Date.today...end这将在第一个子句上短路,因为valid_from为nil,因此为false。 关于ruby-Date与nil的比较失败-ruby,我们

  4. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  5. ruby-on-rails - date_select ruby - 2

    如何在Ruby中扩展date_select的范围??它只显示2005年,我想用它作为出生日期。 最佳答案 您可以使用:start_year选项,参见thedocumentation. 关于ruby-on-rails-date_selectruby,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2047739/

  6. ruby - Rails 比较 date.end_of_day.to_datetime 和 date.to_datetime.end_of_day 返回的日期对象值时返回 false - 2

    ruby1.9.3dev(2011-09-23修订版33323)[i686-linux]轨道3.0.20最近为什么在与DateTimeonRails相关的RSpecs项目上工作我发现在给定日期以下语句发出的值date.end_of_day.to_datetime和date.to_datetime.end_of_day虽然它们表示相同的日期时间,但比较时返回false。为了确认这一点,我打开了Rails控制台并尝试了以下操作1.9.3dev:053>monday=Time.now.monday=>2013-02-2500:00:00+05301.9.3dev:054>monday.cla

  7. ruby-on-rails - 如何在正在运行的 ruby​​ 进程中更改 Date.today 的值 - 2

    我知道这是个坏主意,但我有很多遗留代码,我想运行一些历史批处理作业。我不想更改系统日期,因为其他东西在同一系统上运行。有什么方法可以更改Date.today仅在给定进程的生命周期内返回的值。这里的想法是倒带并运行一些用于处理Date.today的旧批处理脚本。谢谢乔尔 最佳答案 您可以像Nikolaus向您展示的那样对Ruby进行猴子补丁,也可以使用TimeCopgem。它旨在使编写测试更容易,但您也可以在普通代码中使用它。#Setthetimewhereyouwanttogo.t=Time.local(2008,9,1,10,5,

  8. ruby - 为什么 Date.new 不调用初始化? - 2

    我想创建Date的子类。一个正常的、健康的、年轻的ruby​​ist,没有被Date的实现的特殊性所伤害,会以下面的方式来解决这个问题:require'date'classMyDate然后继续以最预期的方式使用它......require'my_date'mdt=MyDate.new(2012,1,28)putsmdt.to_s...只是因为Date::new方法实际上是Date::civil的别名,它永远不会调用初始化。在这种情况下,最后一段代码打印“2012-01-28”而不是预期的“2012-12-25”。亲爱的Ruby社区,这是什么鬼?new别名是否有一些很好的理由,以便它忽略

  9. ruby-on-rails - rails : Validating a Date Greater than Another - 2

    我正在ActiveRecord中编写一个自定义验证器,以便截止日期有意义:validate:deadline_is_possible?defdeadline_is_possible?ifdeadline>begins_aterrors.add(:deadline,'mustbepossible')endend然而,这会生成一个“NoMethodError:未定义的方法`>'fornil:NilClass”。我尝试将日期转换为字符串,例如:defdeadline_is_possible?ifdeadline.to_s>begins_at.to_serrors.add(:deadline,

  10. ruby - 为什么 Date 类的新实例的默认年份等于 -4712? - 2

    运行:require'date'y=Date.newputs"defaultyearis#{y.year}"输出:defaultyearis-4712Date对象的年份默认为-4712是否有任何特殊原因?我认为也许有技术(或传统)原因。我用谷歌搜索并在Ruby文档(2.2.3)中查找了它,但我找不到关于为什么的答案。 最佳答案 公元前4713年1月1日是Julianday的开始,来自维基:TheJulianDayNumber(JDN)istheintegerassignedtoawholesolardayintheJulianday

随机推荐