PHP:3月份两个日期之间的差异不正确

时间:2015-09-17 17:20:04

标签: php date strtotime

我在计算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

对于为什么三月份的总数比他们应该少一些的建议,我们将不胜感激。 :)

2 个答案:

答案 0 :(得分:3)

值得注意的是,所有不正确的结果都包括2015-03-08,对于某些时区,DST在02:00:00生效,这样一小时就会丢失,这与您的结果一致。您可以尝试包括:

date_default_timezone_set('UTC');

在任何日期和时间计算之前,看看结果是否正确。

答案 1 :(得分:1)

日期不是你可以做简单数学的事情。一天不总是86400秒,有些日子不是24小时。

https://3v4l.org/LrTKb是您在三月份的第一个问题的示例,使用DateTime对象完成。