判断任意时刻、位置是白昼?黑夜?
问题描述:给定经纬度(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_daysprivate static int getNdayInYear(int utc) {int year = Integer.valueOf(dateFormat.format(utc * 1000D));return year;}//2.计算bprivate static double getB(int num_days) {return 2 * Math.PI * (num_days - 1) / 365;}//3.计算solar_declinationprivate 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点的时间差。单位是sint 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
判断任意时刻、位置是白昼?黑夜?相关推荐
- 计算任意时刻椭圆轨道上行星的位置的插值方法
目录 需求 搜集到的方法和问题 直接用牛顿力学公式进行模拟的问题 物理常数调整问题 初始化参量不直观 实时求解动力学微分方程 插值方法 问题简化 求解 θ ( t ) \theta(t) θ(t) ( ...
- FineReport:任意时刻只允许在一个客户端登陆账号的插件
在使用FineReport报表系统中,处于账户安全考虑,有些企业希望同一账号在任意时刻智能在统一客户端登录.那么当A用户在C1客户端登陆后,该账号又在另外一个C2客户端登陆,服务器如何取判断呢? 开发 ...
- 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。
采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径.设计算法,将一个无向图的邻接矩阵转换为邻接表. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径. 设计算法,将一个无向图的邻 ...
- 计算任意时刻格林尼治视恒星时角
近期学习卫星轨道方面的一些知识,遇到计算任意时刻格林尼治视恒星时角的问题,在网上搜了好久也没有一个完整的解决方案,后来通过,网上的一些零碎的信息,终于完成了计算格林尼治视恒星时角的程序,先整理如下. ...
- [Android] 任意时刻从子线程切换到主线程的实现
[Android] 任意时刻从子线程切换到主线程的实现 - Android移动开发技术文章_手机开发 - 红黑联盟 转载于:https://www.cnblogs.com/melons/p/57919 ...
- 判断任意控制台输入的十进制数是否为水仙花数
关于水仙花数在前面一篇中已经有介绍,判断任意控制台输入十进制数是否为水仙花数(C++) 以下为Java代码 import java.util.Scanner;public class Amstrong ...
- NSURLSessionDataTask与NSOperationQueue实现多文件断点下载(任意时刻终止进程,重启应用,自动重启下载)...
效果展示 gif有点大,直接连接:7qnbrb.com1.z0.glb.clouddn.com/download.gi- 知识要点 NSOperationQueue线程队列的管理 NSURLSessi ...
- uniapp - APP判断是否开启位置信息服务判断是否授权位置信息权限
当我们在使用uni.getLocation的API时,会发现用户并没有开启微信信息服务或者没有授权位置信息权限,而导致回调fail,那么就需要去判断并引导用户前往开启. 判断是否开启位置信息服务(安卓 ...
- JS:利用函数,求任意三个数最大值,任意两个数的任意运算结果,判断任意数值是否为素数。
1.求任意三个数最大值 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- excel中用Index函数取出数组中任意一个位置的值
本文主要针对这样的一个场景:在一个表中已有一组数据A,在另一个表中可以通过坐标定位取出这一组数据的任意一个位置的数据进行其他运算. 这个场景涉及到了两个问题:1. 如何得到数组A中任意一个位置的数据. ...
最新文章
- 从“人脸”到“狗脸”,AI也要去宠物经济分杯羹?
- 吉林电子计算机学校学费多少,收费标准_吉林工商学院学费介绍_高考院校库
- Ajax请求,跨域小坑
- 我最佩服的一位同学!他是哈工大在读NLP博士积累28W粉丝
- Java集合框架:Arrays工具类
- javascript date utc
- DeDe调用指定栏目ID下的文章
- 深度学习(deep learning)优化调参细节(trick)
- 初识SaltStack
- Servlet和JSP的异同。
- 主分区、扩展分区、逻辑分区、活动分区
- ios 企业签 plist 安装 通用模板
- 山东理工ACM 1151 C语言实验——输出字符串
- Vben Admin 安装依赖l 安装报错:Error: command failed: c: \WINDOWS\system32\cmd.exe /s /c autoreconf -ify 解决办法
- matlab将一列数分割为若干组,将数据拆分为不同组并计算统计量
- 实现财务自由 之 A 股上市公司的年报(年度财报)查阅查看、下载地址、以及下载的方法
- k8s添加pod,k8常用命令,k8s删除pod
- 探索消费级基因检测–祖源
- 织梦进入mysql_织梦phpmyadmin怎么进入
- matlab 数据显示位数,matlab数据位数格式设置