如何计算PHP中一个月的秒数?

时间:2010-11-18 16:22:51

标签: php datetime

如何使用PHP准确确定一个月内的秒数?获取一年中秒数的最佳方法是除以12吗?

13 个答案:

答案 0 :(得分:6)

将该月的天数乘以60 * 60 * 24

答案 1 :(得分:5)

由于节省了白天...用您的语言选择一个好的日期时间库并计算月份的第一天0:00:00和下个月的第一天0:00:00之间的差异并提取秒数。

答案 2 :(得分:2)

您需要多准确?

60秒* 60分钟* 24小时*本月Z天为您提供给定月份的准确数字。

如果您需要平均月份,请查看一年中的秒数,然后除以12。

在某些域名中,例如结算或法律域名,“月份”实际上可能正好是30天。

如果您正在多年工作或在分散系统之间进行紧密集成,则需要咨询资源以确定闰秒。对于历史数据,这可能是一个表,但是通过同步到可信时间源,您将更适合。

http://en.wikipedia.org/wiki/Leap_second

答案 3 :(得分:1)

60(秒)* 60(分钟)* 24(小时)* ##(月内天数)

答案 4 :(得分:1)

假设一天有86,400秒,您可以将此数字乘以DateTime.DaysInMonth函数的结果(在C#中)。以下功能就是这样:

public double SecondsInMonth(int year, int month)
{
   return DateTime.DaysInMonth(year, month) * 86400;
}

例如,找到当月的秒数:

double secondsInCurrentMonth = SecondsInMonth(DateTime.Now.Year, DateTime.Now.Month);

答案 5 :(得分:0)

给定月份的天数*小时/天*分钟/小时*秒/分钟

是最好的方式。

答案 6 :(得分:0)

如果你在纯数学中这样做,它将是60 * 60 * 24 * <number of days in month>

用例是什么?

答案 7 :(得分:0)

不,使用特定语言的可用日期API并确定当月的天数。然后计算秒数。还考虑到闰年。

答案 8 :(得分:0)

取决于您是想要平均月份还是特定月份....您的方式获得平均值。对于特定月份计数天数并乘以86400(每天24.0小时的秒数)

答案 9 :(得分:0)

这不是一个编程问题。月份有不同的长度,因此将一年中的秒数除以12将不会给您带来任何帮助。很容易确定一个月内的日子 - 一个简单的查找表加上闰年的计算就可以了。然后乘以一天中的秒数。

如果你真的很精确,你可能需要包括闰秒的计算,但由于它们是根据天文计算不可预测地分配的,并且不能提前预测,我可能会忽略它们。

答案 10 :(得分:0)

每个月的天数不同。适当的算法是获取飞蛾的天数并将其乘以86400(一天中的秒数)。您可能还需要平均计数或闰年计算...

答案 11 :(得分:0)

简单的答案是找到当月的天数,然后乘以86400.如果您处理UTC中的日期和时间,这将非常有效。但是,如果您使用的是本地时区,则如果该时区遵守夏令时,则此方法会产生稍微不正确的结果。错误在一个月内有些小,但如果您需要在短时间内(如一天)进行类似的计算,则会放大。我绝对建议在UTC中进行所有处理和存储,但根据应用程序,您必须将UTC时间转换为最终用户期望的本地时区。甚至可能有必要使用本地时区计算持续时间。同样,尽可能使用UTC,以避免大部分问题。

我在C#中提出了这个解决方案。它与UTC和本地时区兼容。您只需要告诉GetNumberOfSecondsInMonth您希望计算基于哪个时区。在我的例子中,我选择了2010年11月,因为在密苏里州,我们观察到DST,本月还有一个小时。夏令时规则发生变化,因此我使用了一个API来从操作系统中提取DST信息,以便计算在2007年之前的几年内正确(即美国为大多数区域扩展DST时)。

我应该指出,我的解决方案不能处理UTC中的闰秒。对我来说,这绝不是一个问题。但如果真的需要超高精度计时,那么使用查找表就可以轻松解决这个问题。

public class Program
{
    static void Main(string[] args)
    {
        int seconds = GetNumberOfSecondsInMonth(2010, 11, DateTimeKind.Local);
    }

    public static int GetNumberOfSecondsInMonth(int year, int month, DateTimeKind kind)
    {
        DateTime start = new DateTime(year, month, 1);
        DateTime end = start.AddMonths(1);
        int seconds = (int)(end - start).TotalSeconds;
        if (kind == DateTimeKind.Local)
        {
            DaylightTime dt = TimeZone.CurrentTimeZone.GetDaylightChanges(year);
            seconds = (dt.Start > start) ? seconds - 3600 : seconds;
            seconds = (dt.End < end) ? seconds + 3600 : seconds;
        }
        return seconds;
    }
}

答案 12 :(得分:0)

这是几个月的问题,因为它们没有固定的天数。但经过深思熟虑,我已经想出了怎么做。计算30或31天的月数并不是一个好主意,因为它看起来很糟糕,例如从1年转换到数月会给出11个月和25天的答案,如果我每个月有30天,如果我每个月有31天,则为12个月零5天。

相反,我每个月都要经历一系列日子:30,30,31,30,31,30,31,30,31,30,31,30,一年共计365天。因此,如果我想要4个月内的天数,我会增加30 + 30 + 31 + 30。如果我从23个月开始,它将经历几乎两次循环(23次30或31)。它是在while / until循环中完成的。每4年我增加1天,使其为366天(前30个在列表中更改为31)。它相当复杂,但它起作用,结果看起来更好。