我在计算PHP中两个日期之间的夜晚时遇到一些问题。
我发现的问题仅存在于3月份的某些日期(但并非全部,但似乎不影响其他月份)。
我正在使用的准则:
public class MonitorService extends Service implements BeaconConsumer
{
private BeaconManager beaconManager;
@Override
public void onCreate()
{
super.onCreate();
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.setForegroundScanPeriod(5000l);
beaconManager.setBackgroundScanPeriod(5000l);
beaconManager.setForegroundBetweenScanPeriod(1100l);
beaconManager.setBackgroundBetweenScanPeriod(1100l);
setupBeaconManager();
}
private void setupBeaconManager()
{
if (!beaconManager.isBound(this))
beaconManager.bind(this);
}
private void unsetBeaconManager()
{
if (beaconManager.isBound(this))
{
beaconManager.unbind(this);
try
{
beaconManager.stopRangingBeaconsInRegion(new Region("apr", null, null, null));
}
catch (RemoteException e)
{
Log.i(TAG, "RemoteException = "+e.toString());
}
}
}
@Override
public void onBeaconServiceConnect()
{
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region)
{
Log.i(TAG,"didRangeBeaconsInRegion, number of beacons detected = "+beacons.size());
// HERE IT IS : the size is Always 1, but the beacon (UUID etc. can be different)
}
});
try
{
beaconManager.startRangingBeaconsInRegion(new Region("apr", null, null, null));
}
catch (RemoteException e)
{
Log.i(TAG, "RemoteException = "+e.toString());
}
}
@Override
public void onDestroy()
{
unsetBeaconManager();
super.onDestroy();
}
}
以下是6月的一些输出(正确计算的夜数):
// The Calculation.
// Note: $endDate, and $startDate are unix timestamps returned from strtotime().
$diff = $endDate - $startDate;
$totalNights = floor($diff/(60*60*24));
// Debugging.
$debugStr = "FROM " .
date("Y-m-d", $startDate) .
" - ". date("Y-m-d", $endDate) .
": $totalNights Nights";
file_put_contents("/tmp/date_debug.txt", $debugStr . PHP_EOL, FILE_APPEND);
这是三月的一些输出(一些正确,一些不正确的夜晚)
FROM 2015-06-01 - 2015-06-03: 2 Nights // Correct
FROM 2015-06-16 - 2015-06-26: 10 Nights // Correct
FROM 2015-06-19 - 2015-06-22: 3 Nights // Correct
FROM 2015-06-01 - 2015-06-02: 1 Nights // Correct
FROM 2015-06-21 - 2015-06-23: 2 Nights // Correct
FROM 2015-06-21 - 2015-06-23: 2 Nights // Correct
FROM 2015-06-01 - 2015-06-01: 0 Nights // Correct
FROM 2015-06-03 - 2015-06-04: 1 Nights // Correct
FROM 2015-06-05 - 2015-06-06: 1 Nights // Correct
FROM 2015-06-12 - 2015-06-16: 4 Nights // Correct
FROM 2015-06-01 - 2015-06-03: 2 Nights // Correct
FROM 2015-06-04 - 2015-06-30: 26 Nights // Correct
对于为什么三月份的总数比他们应该少一些的建议,我们将不胜感激。 :)
答案 0 :(得分:3)
值得注意的是,所有不正确的结果都包括2015-03-08,对于某些时区,DST在02:00:00生效,这样一小时就会丢失,这与您的结果一致。您可以尝试包括:
date_default_timezone_set('UTC');
在任何日期和时间计算之前,看看结果是否正确。
答案 1 :(得分:1)
日期不是你可以做简单数学的事情。一天不总是86400秒,有些日子不是24小时。
https://3v4l.org/LrTKb是您在三月份的第一个问题的示例,使用DateTime对象完成。