判断任意时刻、位置是白昼?黑夜?

本文介绍了一种根据给定的经纬度和UTC时间戳判断特定时刻是白天还是黑夜的方法。通过计算白昼时长、时区正午时间差值及与中午12点的时间差,确定了当前时刻是否处于白昼阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:给定经纬度(lon,lat),计算某时刻(utc时间戳)是白天还是黑夜?

具体代码实现如下:

package common.utils;

import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * @description:①给定任意utc,计算该utc对应的白昼时长。调用函数:getDayTimeLength(int utc);
 * ②给定经纬度(lon,lat),计算某时刻(utc时间戳)是白天还是黑夜?
 * @author: fangchangtan
 * @create: 2019-01-14 15:10
 */
public class DayNightUtil {
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("D");

    /*
    角度转换为弧度的公式
     */
    private static double toRadians(double angel) {
        return Math.PI * angel / 180;
    }

    //1.计算utc对应的是一年中的第几天;计算num_days
    private static int getNdayInYear(int utc) {
        int year = Integer.valueOf(dateFormat.format(utc * 1000D));
        return year;
    }

    //2.计算b
    private static double getB(int num_days) {
        return 2 * Math.PI * (num_days - 1) / 365;
    }

    //3.计算solar_declination
    private static double getSolar_Declination(int utc) {
        int ndayInYear = getNdayInYear(utc);
        double b = getB(ndayInYear);
        double solar_declination = 0.006918 - 0.399912 * Math.cos(b)
                + 0.070257 * Math.sin(b)
                - 0.006758 * Math.cos(2 * b)
                + 0.000907 * Math.sin(2 * b)
                - 0.002697 * Math.cos(3 * b)
                + 0.00148 * Math.sin(3 * b);
        return solar_declination;
    }

    /*
    4.计算t:昼长计算公式
    单位是小时
     */
    public static double getDayTimeLength(int utc, double currentLat) {
        double solar_declination = getSolar_Declination(utc);
        double dayLong = 0;
        dayLong = 24 - (2 / 15d) * Math.acos(Math.tan(toRadians(currentLat)) * Math.tan(solar_declination)) * (180 / Math.PI);
        if (Double.isNaN(dayLong) || Double.isInfinite(dayLong)) {
        //判断是不是极昼极夜
            if (Math.sin(toRadians(currentLat)) * Math.sin(solar_declination) > 0) {//是极昼现象
                return 24;
            } else {//是极夜现象
                return 0;
            }
        }
        return dayLong;
    }


    /*
    获取各个时区中的正午时间差值:单位s秒
    例如121度,是+240s
     */
    private static int getMidDayInTimeZone(double lon) {
        double value = lon % 15;
        int midday = (int) ((Math.abs(value) > 7.5 ? 15 - Math.abs(value) : Math.abs(value)) * Math.signum(value) * 4 * 60);
        return midday;
    }

    /**
     * 根据经度获取时区;例如121:+8;-121:-8;
     *
     * @param currentLon
     * @return
     */
    public static String caculateTimeZone(double currentLon) {
        int timeZone;
        int shangValue = (int) (currentLon / 15);
        double yushuValue = Math.abs(currentLon % 15);
        if (yushuValue <= 7.5) {
            timeZone = shangValue;
        } else {
            timeZone = shangValue + (currentLon > 0 ? 1 : -1);
        }
        return timeZone >= 0 ? "+" + Math.abs(timeZone) : "-" + Math.abs(timeZone);
    }

    private static SimpleDateFormat dateFormatYMD = new SimpleDateFormat("yyyy-MM-dd");
    private static SimpleDateFormat dateFormatHms = new SimpleDateFormat("HH:mm:ss");

    /**
     * func:判断白天,还是黑夜
     * isDayTime ? 1 : 2其中1:白天;2:是黑夜
     * @param utc
     * @param currentLon
     * @param currentLat
     * @return
     */
    public static int judegeDayOrNight(int utc, double currentLon, double currentLat) {
        //获得白昼时长
        double dayTimeLength = getDayTimeLength(utc, currentLat);
        System.out.println("dayTimeLength: " + dayTimeLength);
        //获得与中午12:00点的时间差。单位是s
        int middayOffset = getMidDayInTimeZone(currentLon);
        //获得时区编号
        String sTimeZone = caculateTimeZone(currentLon);
        dateFormatHms.setTimeZone(TimeZone.getTimeZone("GMT" + sTimeZone));
        String HHmmss = dateFormatHms.format(utc * 1000L);
        String[] split = HHmmss.split(":");
        double hour = 0;
        if (split.length == 3) {
            hour = Integer.valueOf(split[0]) + Integer.valueOf(split[1]) / 60 + Integer.valueOf(split[2]) / 3600;
        }
        //如果时间差值小于昼长的一半(t/2),则当前时刻为白昼,否则为黑夜
        boolean isDayTime;
        if ((12 + middayOffset / 3600) - dayTimeLength / 2 < hour && hour <= (12 + middayOffset / 3600) + dayTimeLength / 2) {
            isDayTime = true;
        } else {
            isDayTime = false;
        }
        return isDayTime ? 1 : 2;
    }


    /**
     * 主函数main
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
//            double nday = getDayTimeLength(1484611200, 10 * i);
//            System.out.println("i:" + i + "; ndayLength:" + nday);
            int iDayTime = judegeDayOrNight(1484611200, 116, 10 * i);
            System.out.println(iDayTime);
        }

    }


}

时间仓促,简单测试通过!如有不足,欢迎指正!

可以参考;http://www.cnblogs.com/hanoi/archive/2012/07/04/2576325.html

<think>我们正在处理一个关于“展现的定义”的查询。用户希望了解“展现”这个词的含义。根据任务要求,我们需要进行网络搜索,整合信息,并按照特定格式生成答案。步骤:1.调用网络搜索工具,检索“展现的定义”或“展现的含义”。2.从搜索结果中提取关于“展现”的定义,注意可能来自不同领域(如一般汉语词典、特定领域如计机、艺术等)。3.整合信息,给出一个清晰、全面的定义,并可能包括不同语境下的解释。4.按照要求组织答案:避免第一人称,避免步骤词汇,分成几个部分(如基本含义、扩展含义等)并用换行分隔。5.最后,按照格式要求添加相关问题部分。注意:由于问题中没有代码或公式,所以不需要使用代码块或公式格式。开始搜索:通过搜索,我们了解到:-在一般汉语中,“展现”是一个动词,意思是“明显地表现出来”。-在计机领域(如数据可视化),“展现”可能指将数据以图形或图表的形式展示出来。-在艺术领域,“展现”可能指展示艺术作品或表演。我们将整合这些信息,给出定义。答案结构:第一部分:基本定义(来自汉语词典)第二部分:在特定领域(如计机、艺术等)的含义然后,生成相关问题。注意:不能将引用内容集中在末尾,所以我们在行文中自然融入。开始生成答案:</think>### 展现的定义 展现指将事物、信息或内在特质通过可见形式呈现出来,使其能被观察或理解。在不同领域有具体含义: - **通用含义**:指清晰表达、展示或显露某种内容(如才华、数据、现象)。 - **数据领域**:特指将处理后的信息以可视化形式(图表、图形等)输出。 - **艺术领域**:通过创作(绘画、表演等)传递情感或理念。 - **技术领域**:在Web开发中,指服务器处理数据后生成用户可见的页面(如HTML渲染)。 例如,在数据可视化中,公式 $y = f(x)$ 通过图表展现变量关系;在编程中,前端框架将JSON数据展现为UI元素: ```javascript // React组件展现数据 function DataDisplay({ data }) { return ( <div> {data.map(item => <p key={item.id}>{item.name}</p>)} </div> ); } ``` 本质是通过可感知媒介(视觉/听觉等)实现信息传递,强调从抽象到具象的转化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值