我想添加两个日期间隔来计算小时和分钟的总持续时间,实际上我想要执行addittion,如下所示:
$a = new DateTime('14:25');
$b = new DateTime('17:30');
$interval1 = $a->diff($b);
echo "interval 1 : " . $interval1->format("%H:%I");
echo "<br />";
$c = new DateTime('08:00');
$d = new DateTime('13:00');
$interval2 = $c->diff($d);
echo "interval 2 : " . $interval2->format("%H:%I");
echo "<br />";
echo "Total interval : " . $interval1 + $interval2;
Run Code Online (Sandbox Code Playgroud)
任何想法如何执行这种类型的间隔添加,以获得PHP中的总小时和分钟格式的两个间隔的总和
我发现PHP中的DateTime对象可以与另一个对象进行比较,因为">"和"<"运算符被重载.
和DateInterval一样吗?
当我试图回答这个问题时,我发现了一些奇怪的东西:
<?php
$today = new DateTime();
$release = new DateTime('14-02-2012');
$building_time = new DateInterval('P15D');
var_dump($today->diff($release));
var_dump($building_time);
var_dump($today->diff($release)>$building_time);
var_dump($today->diff($release)<$building_time);
if($today->diff($release) < $building_time){
echo 'oK';
}else{
echo 'Just a test';
}
Run Code Online (Sandbox Code Playgroud)
它总是呼应"只是一个测试".var_dump输出是:
object(DateInterval)#4 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(18)
["h"]=>
int(16)
["i"]=>
int(49)
["s"]=>
int(19)
["invert"]=>
int(1)
["days"]=>
int(18)
}
object(DateInterval)#3 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(15)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
}
bool(false)
bool(true)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用DateTime作为"01-03-2012"时,一切正常.
什么是最简单的方法来获得两个PHP之间的天数差异DateTimes,考虑午夜作为一天的变化(就像DATEDIFF(DAY)SQL函数一样)?
例如,在今天的13:00和明天的12:00之间,我应该得到1(天),即使间隔小于24小时.
$date1 = new DateTime("2013-08-07 13:00:00");
$date2 = new DateTime("2013-08-08 12:00:00");
echo $date1->diff($date2)->days; // 0
Run Code Online (Sandbox Code Playgroud) 我已经尝试使用date_diff和date_create来获得已经转换为字符串的两个日期的差异.
这是代码:
$date_1 = date_create();
$date_now = date_format($date_1, 'Y-m-d');
//echo $date_now . "\n";
$date=date_create($date_now);
date_add($date,date_interval_create_from_date_string("3 days"));
$date_return = date_format($date,"Y-m-d");
$diff = date_diff(date_create($date_now), date_create($date_return));
echo $diff;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Object of class DateInterval could not be converted to string
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
$i1 = DateInterval::createFromDateString('10 minutes');
$i2 = DateInterval::createFromDateString('30 minutes');
var_dump($i1 > $i2);
var_dump($i1 > $i2);
var_dump($i1);
var_dump($i1 > $i2);
var_dump($i1 > $i2);
Run Code Online (Sandbox Code Playgroud)
而这个输出:
bool(false)
bool(false)
object(DateInterval)#3 (8) {
...
}
bool(true)
bool(true)
Run Code Online (Sandbox Code Playgroud)
这是一个php bug吗?帮助我理解这种行为的原因
有很多问题要求如何以另一种方式执行此操作(从此格式转换),但我无法找到有关如何在PHP中以ISO 8601持续时间格式输出的任何内容.
所以我有一堆人类可读格式的持续时间字符串 - 我想在运行时将它们转换为ISO 8601格式,以打印HTML5微数据的持续时间.下面是一些字符串的示例,以及它们应如何格式化
"1 hour 30 minutes" --> PT1H30M
"5 minutes" --> PT5M
"2 hours" --> PT2H
Run Code Online (Sandbox Code Playgroud)
你明白了.
我可以将字符串推送到PHP中的间隔对象:
date_interval_create_from_date_string("1 hour 30 minutes");
Run Code Online (Sandbox Code Playgroud)
但似乎没有ISO 8601输出选项 - 我该如何处理?
谢谢大家.
我已经看到了许多方法来根据特定的日期组件来计算两个日期之间的差异,例如,以天,小时,月等为单位(请参见Stackoverflow上的此答案):
Calendar.current.dateComponents([.hour], from: fromDate, to: toDate).hour
Calendar.current.dateComponents([.day], from: fromDate, to: toDate).day
Calendar.current.dateComponents([.month], from: fromDate, to: toDate).month
Run Code Online (Sandbox Code Playgroud)
我还没有看到如何使用实际Date对象进行计算。就像是
func computeNewDate(from fromDate: Date, to toDate: Date) -> Date
let delta = toDate - fromDate
let today = Date()
if delta < 0 {
return today
} else {
return today + delta
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了DateIntervaliOS 10中引入的类型,但是根据文档
[it]不支持反向间隔,即持续时间小于0且结束日期在时间上早于开始日期的间隔。
这样就很难计算日期,尤其是当您不知道哪个是较早的日期时。
是否有任何简洁的方法可以Date直接计算s 之间的时间差(并将它们Date再次添加到实例中)而无需使用它们进行计算timeIntervalSinceReferenceDate?
我需要一个正则表达式来验证ISO 8601持续时间格式的持续时间(除了我不需要的小数部分).
PnYnMnDTnHnMnS
PNW
这是我有的:
^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
Run Code Online (Sandbox Code Playgroud)
唯一的问题是字符串P和PT这个正则表达式是允许的,因为所有部分都是"零或一" ?.
T则需要有时间分量(H,M或S)T则可能有也可能没有任何日期组件(Y,M或D)P72H,大部分相当于P3D)可接受的投入:
P1Y // date component only
P2MT30M // date and time components
PT6H // time component only
P5W // another date component
Run Code Online (Sandbox Code Playgroud)
不可接受的投入:
P // no components
PT // no components
P3MT // T specified but not time components
Run Code Online (Sandbox Code Playgroud)
现在无效的字符串正在通过客户端验证,但在服务器端失败,因为它被传入DateInteval但我想在可能的情况下在客户端失败.如果每个人都在使用Chrome 40+,我可以minlength='3'在输入元素上指定帮助,但遗憾的是并非如此.
我想用PHP计算一个事件的开始和结束日期时间.我得到了这个事件的开始和添加的持续时间以结束.所以我尝试了以下代码:
$startTime = $this->getStartTime();
$endTime = $this->getStartTime();
$endTime->add(new DateInterval('PT75M'));
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我将75分钟添加到开始时间,然后计算事件的结束.它有效,但它也编辑了开始时间.我在PHP文档中读到ADD方法编辑了被调用的对象,但我不明白它如何编辑startEdit变量.我没有在我在示例中编写的任何方法中使用引用,也没有在getStartTime函数中使用引用
嗨,我有脚本给我一周之间的日期列表.我需要反向订单.alredy尝试了rsort,reverse_array,以及更多一些如何给出错误.
谢谢.
脚本
$date2 = "$lastweek2";
$date1 = "$lastweek1";
$start = new DateTime($date2);
$end = new DateTime($date1);
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start, $interval, $end);
echo "<br>";
foreach ($period as $dt) {
echo $dt->format("Y-m-d") . "<br>\n";
}
Run Code Online (Sandbox Code Playgroud)
回声是这样的
2014-08-09
2014-08-10
2014-08-11
2014-08-12
2014-08-13
2014-08-14
2014-08-15
Run Code Online (Sandbox Code Playgroud)
反向的
2014-08-15
2014-08-14
2014-08-13
2014-08-12
2014-08-11
2014-08-10
2014-08-09
Run Code Online (Sandbox Code Playgroud)