之前,采用拼接字符串的形式,不断地在Date类型和Long类型之间转换,实在是太过于麻烦,后来采取了这种思路:假设我们将22:00 ~ 10:00 视为夜间时间,则我们先计算出10:00 相对于当天的分钟数,22:00 相对于当天的分钟数,然后将我们取到的Date转换成Long型,加上8 * 60 * 60 * 1000,对 一天的分钟数取余,根据结果来判断是在白天还是夜晚,while循环中继续累加下一分钟,下面见具体算法

package com.company;

import com.sun.scenario.Settings;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date startOrderTime = sdf.parse("2018-05-23 14:00:00");
        Date endOrderTime = sdf.parse("2018-05-24 14:36:28");
        String staN = "22:00:00";
        String etaN = "10:00:00";
        new Main().calcRoughly(startOrderTime, endOrderTime, staN, etaN);
    }

    private void calcRoughly(Date startOrderTime, Date endOrderTime, String startTimeAtNight, String endTimeAtNight) {
        // 以分钟为单位进行统计
        long dayTime = 0;
        long nightTime = 0;
        long startTime = startOrderTime.getTime();
        long endTime = endOrderTime.getTime();
        long startCurMinutes = calcCurMinutes(startTimeAtNight);
        long endCurMinutes = calcCurMinutes(endTimeAtNight);
        while (startTime <= endTime) {
            long modTime = ((startTime + 8 * 60 * 60 * 1000) / (1000 * 60)) % (24 * 60);
            if (modTime >= endCurMinutes && modTime < startCurMinutes) {
                dayTime += 1;
            }
            else {
                nightTime += 1;
            }
            startTime += (1000 * 60);
        }
        System.out.println(dayTime);
        System.out.println(nightTime);
    }

    // 时间字符串 "22:00:00"
    long calcCurMinutes(String time) {
        String pattern = "\\d{2}:\\d{2}:\\d{2}";
        if (Pattern.matches(pattern, time)) {
            int hour = Integer.valueOf(time.substring(0, 2));
            int minutes = Integer.valueOf(time.substring(3, 5));
            return hour * 60 + minutes;
        }
        return 0;
    }

}

java中计算一段时间内白天的时间和夜晚的时间的更多相关文章

  1. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  2. storm入门(二):关于storm中某一段时间内topN的计算入门

    刚刚接触storm 对于滑动窗口的topN复杂模型有一些不理解,通过阅读其他的博客发现有两篇关于topN的非滑动窗口的介绍.然后转载过来. 下面是第一种: Storm的另一种常见模式是对流式数据进行所 ...

  3. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  4. Java 中计算注意!!!

    * 使用BigDecimal需要注意的事项:  * 1.两个BigDecimal值不能使用" +, -, *, / " 进行加减乘除,要使用" add, substrac ...

  5. java中计算两个日期之间天数的程序设计。

    //用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...

  6. java中计算两个时间差

    java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...

  7. 关于Java中计算日期差值不准确问题

    1.字符串日期相减 如:2016-4-1,必须先将此字符串转成Date对象,并且, 格式必须为:yyyy—MM—dd  HH:mm:ss. 如果不转就直接计算(2016-4-1)两个这样的日期,则误差 ...

  8. JAVA中计算两个时间相差多少 天,时,分,秒

    1: import java.util.Date; 2: 3: public class ShowTimeInterval{ 4: public void ShowTimeInterval(Date ...

  9. java中计算时间差

    Calendar cale = null; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...

随机推荐

  1. boost的asio接收单路大数据量udp包的方法

    开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个 ...

  2. AngularJS核心特性(四大点)

    本人刚刚接触AngularJS,还不太熟悉,就说说我目前遇到的一些注意点吧. 1.调用外来文件script文件 AngularJS核心特性一  MVC MVC设计模式 html文件 <!DOCT ...

  3. 转:MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入?

    转:MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入? 数据库内核月报 链接:http://mysql.taobao.org/monthly/2018/05/07/ Mo ...

  4. Spring学习五

    1: servlet生命周期:  Servlet加载    ->   实例化->   服务 ->  销毁 2:Servlet重要函数: init():在Servlet的生命周期中,仅 ...

  5. Rails的静态资源管理(五)—— 自定义 Asset Pipeline

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  6. 将Windows下磁盘出现黑色为分配区域变成绿色区域

    在windows下不知什么原因, 有一块磁盘空间F盘就变成了黑色为分配区域. 黑色区域无法用来安装双系统, 网上查阅资料后, 找到了如何将他重新变回绿色区域的2个方法(方法二是自己无意操作成功的). ...

  7. centos6 安装teamviewer

    wget http://www.teamviewer.com/download/teamviewer_linux.rpm yum -y install temviewerX.rpm 机器最好联网,能够 ...

  8. DAY14-前端之Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  9. 浅谈Android四大组建之一Service---Service与Activity的绑定

    从上一篇文章我们学会了如何创建Service,我们通过监听一个按钮,然后再按钮里面通过意图来启动Service.但是我们有没有发现,启动服务以后,Activity和Service之间的联系好像就断开了 ...

  10. 2016上海浦东汽车展览会C+罩杯 车模名单

    只能帮你们到这了