查找两个日期之间的天数的算法

时间:2017-08-19 17:10:23

标签: java algorithm

我正在处理学校问题,找出算法,找出两个给定日期之间的日期,然后用Java实现。

感兴趣的算法在这里找到: http://www.sunshine2k.de/articles/coding/datediffindays/calcdiffofdatesindates.html (第4点)

这是一种更有效的算法,因为它在实施过程中需要考虑的条件最少。我理解它在这种情况下是如何工作的,但我无法完全围绕在其他地方使用原点/参考点,因为看起来简单的减法可以完成大部分工作。

EG。要找到9和5之间的差异, 我可以9-5而不是

ref = 1

difference = (9-ref) - (5-ref)

问题:为什么在这种情况下使用此参考/原点?我可以考虑使用此参考/原点解决问题还有哪些其他情况?

3 个答案:

答案 0 :(得分:3)

软件工程的第一条规则是“不要重新发明轮子”。

在Java 8及更高版本中获取两个日期之间的日子是微不足道的,不需要编写自己的算法代码:

<?php 
        $mysql_result = (array) json_decode(file_get_contents('zips'));
        if(isset($_GET['ajax'])){
        header('content-type: application/json');    
            $_GET['offset'] = isset($_GET['offset'])?$_GET['offset']:0;     
            echo json_encode(array_slice($mysql_result,$_GET['offset'],10));
            exit;
        }
        $ar = array_slice($mysql_result,0,10);//or add LIMIT 10 in sql query
    ?>
    <table border="on" width="100%">
    <tbody id="songartiststuff">
        <?php foreach($ar as $k => $r)://initial render?>
        <tr>
            <td data-replace="code"><?=$r->code?></td>
            <td data-replace="country"><?=$r->country?></td>
        </tr>
        <?php endforeach;?>
    </tbody>
    </table>
    <center>
    <button data-next="10">Next</button>
    <button data-prev="0">Prev</button>
    </center>
    <script src="jquery.js"></script>
        <?php 
        $mysql_result = (array) json_decode(file_get_contents('zips'));
        if(isset($_GET['ajax'])){
        header('content-type: application/json');    
            $_GET['offset'] = isset($_GET['offset'])?$_GET['offset']:0;     
            echo json_encode(array_slice($mysql_result,$_GET['offset'],10));
            exit;
        }
        $ar = array_slice($mysql_result,0,10);//or add LIMIT 10 in sql query
    ?>
    <table border="on" width="100%">
    <tbody id="songartiststuff">
        <?php foreach($ar as $k => $r)://initial render?>
        <tr>
            <td data-replace="code"><?=$r->code?></td>
            <td data-replace="country"><?=$r->country?></td>
        </tr>
        <?php endforeach;?>
    </tbody>
    </table>
    <center>
    <button data-next="10">Next</button>
    <button data-prev="0">Prev</button>
    </center>
    <script src="jquery.js"></script>
    <script>    
        $(()=>{
            document.querySelector('[data-next]').addEventListener('click',function(){
                move(this.dataset.next);
                console.log(this.dataset.next);
                this.setAttribute('data-next',parseInt(this.dataset.next) + 10);//add to next
                var prv = document.querySelector('[data-prev]');
                prv.setAttribute('data-prev',parseInt(prv.dataset.prev) + 10);//add to prev
            })

            document.querySelector('[data-prev]').addEventListener('click',function(){
                move(this.dataset.prev);
                console.log(this.dataset.prev);
                this.setAttribute('data-prev',parseInt(this.dataset.prev) - 10);// remove form next
                var nxt = document.querySelector('[data-next]');
                nxt.setAttribute('data-next',parseInt(nxt.dataset.next) - 10);//remove from prev
            })

            function move(int){
                var template = document.querySelector('tbody tr').cloneNode(true);//get a sample from tbody
                $.get('table.php?ajax=true&offset='+int).success(function(data){
                    $(document.querySelector('tbody')).empty();
                    $.each(data,function(i,v){
                        let tp = tmp.cloneNode(true);//clone the template
                        tp.querySelector("[data-replace='code']").innerHTML = v.code;//replace code
                        tp.querySelector("[data-replace='country']").innerHTML = v.country;//replace country
                        document.querySelector('tbody').appendChild(tp);//append to tbody
                    })
                });
            }
        });
    </script>

甚至更好

    LocalDate d2 = LocalDate.now();
    LocalDate d1 = LocalDate.of(1950, Month.JANUARY, 1);
    long days = d1.until(d2,ChronoUnit.DAYS); 

答案 1 :(得分:0)

要在同一个月的第9天和第5天之间获得差异,您可以减去9-5 (如果在此期间没有日历革命:))。但是对于不同月份和不同年份,您必须考虑当月的不同天数和一年中不同的天数。

考虑这些因素的最简单方法是从某个起源日获得绝对天数 - 所谓的Julian day以我们的时代为起点

答案 2 :(得分:0)

实际上,9-5使用与0相同的(9-0) - (5-0)引用。

与数字不同,0是参考点,对于日期,参考点并不明显。它应该是公元0年,公元1900年还是其他什么?由于月份,闰年等天数不同,日数不均匀。因此,找到日期与共同日期的“距离”是有用的,例如, 1970-01-01