import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* (1)先计算出从格林威治时间公元2000年1月1日到计算日天数days;
* (2)计算从格林威治时间公元2000年1月1日到计算日的世纪数t, 则t=(days+UTo/360)/36525;
* (3)计算太阳的平黄径 : L=280.460+36000.770×t;
* (4)计算太阳的平近点角 :G=357.528+35999.050×t
* (5)计算太阳的黄道经度 :λ=L+1.915×sinG+0.020xsin(2G);
* (6)计算地球的倾角 ε=23.4393-0.0130×t;
* (7)计算太阳的偏差 δ=arcsin(sinε×sinλ);
* (8)计算格林威治时间的太阳时间角GHA: GHA=UTo-180-1.915×sinG-0.020×sin(2G) +2.466×sin(2λ)-0.053×sin(4λ)
* (9)计算修正值e: e=arcos{[ sinh-sin(Glat)sin(δ)]/cos(Glat)cos(δ)}
* (10)计算新的日出日落时间 :UT=UTo-(GHA+Long±e); 其中“+”表示计算日出时间,“-”表示计算日落时间;
* (11)比较UTo和UT之差的绝对值,如果大于0.1°即0.007小时,把UT作为新的日出日落时间值,重新从第(2)步开始进行迭代计算,如果UTo和UT之差的绝对值小于0.007小时,则UT即为所求的格林威治日出日落时间;
* (12)上面的计算以度为单位,即180°=12小时,因此需要转化为以小时表示的时间,再加上所在的时区数Zone,即要计算地的日出日落时间为 :T=UT/15+Zone
* 上面的计算日出日落时间方法适用于小于北纬60°和南纬60°之间的区域,如果计算位置为西半球时,经度Long为负数。
*/
public class SunRiseSet { private static int[] days_of_month_1 = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; private static int[] days_of_month_2 = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; private final static double h = -0.833;//日出日落时太阳的位置 private final static double UTo = 180.0;//上次计算的日落日出时间,初始迭代值180.0 // 1、判断是否为闰年:若为闰年,返回1;若不是闰年,返回0
public static boolean leap_year(int year) {
if (((year % 400 == 0) || (year % 100 != 0) && (year % 4 == 0))) return true;
else return false;
} // 1、求从格林威治时间公元2000年1月1日到计算日天数days
public static int days(int year, int month, int date) { int i, a = 0; for (i = 2000; i < year; i++) { if (leap_year(i)) a = a + 366; else a = a + 365; } if (leap_year(year)) { for (i = 0; i < month - 1; i++) { a = a + days_of_month_2[i]; } } else { for (i = 0; i < month - 1; i++) { a = a + days_of_month_1[i]; } } a = a + date; return a; } //求格林威治时间公元2000年1月1日到计算日的世纪数t
public static double t_century(int days, double UTo) { return ((double) days + UTo / 360) / 36525; } //求太阳的平黄径
public static double L_sun(double t_century) { return (280.460 + 36000.770 * t_century); } //求太阳的平近点角
public static double G_sun(double t_century) { return (357.528 + 35999.050 * t_century); } //求黄道经度
public static double ecliptic_longitude(double L_sun, double G_sun) { return (L_sun + 1.915 * Math.sin(G_sun * Math.PI / 180) + 0.02 * Math.sin(2 * G_sun * Math.PI / 180)); } //求地球倾角
public static double earth_tilt(double t_century) { return (23.4393 - 0.0130 * t_century); } //求太阳偏差
public static double sun_deviation(double earth_tilt, double ecliptic_longitude) { return (180 / Math.PI * Math.asin(Math.sin(Math.PI / 180 * earth_tilt) * Math.sin(Math.PI / 180 * ecliptic_longitude))); } //求格林威治时间的太阳时间角GHA
public static double GHA(double UTo, double G_sun, double ecliptic_longitude) { return (UTo - 180 - 1.915 * Math.sin(G_sun * Math.PI / 180) - 0.02 * Math.sin(2 * G_sun * Math.PI / 180) + 2.466 * Math.sin(2 * ecliptic_longitude * Math.PI / 180) - 0.053 * Math.sin(4 * ecliptic_longitude * Math.PI / 180)); } //求修正值e
public static double e(double h, double glat, double sun_deviation) { return 180 / Math.PI * Math.acos((Math.sin(h * Math.PI / 180) - Math.sin(glat * Math.PI / 180) * Math.sin(sun_deviation * Math.PI / 180)) / (Math.cos(glat * Math.PI / 180) * Math.cos(sun_deviation * Math.PI / 180))); } //求日出时间
public static double UT_rise(double UTo, double GHA, double glong, double e) { return (UTo - (GHA + glong + e)); } //求日落时间
public static double UT_set(double UTo, double GHA, double glong, double e) { return (UTo - (GHA + glong - e)); } //判断并返回结果(日出)
public static double result_rise(double UT, double UTo, double glong, double glat, int year, int month, int date) {
double d; if (UT >= UTo) d = UT - UTo; else d = UTo - UT; if (d >= 0.1) { UTo = UT; UT = UT_rise(UTo, GHA(UTo, G_sun(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))), glong, e(h, glat, sun_deviation(earth_tilt(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))))); result_rise(UT, UTo, glong, glat, year, month, date); } return UT; } //判断并返回结果(日落)
public static double result_set(double UT, double UTo, double glong, double glat, int year, int month, int date) { double d; if (UT >= UTo) d = UT - UTo; else d = UTo - UT; if (d >= 0.1) { UTo = UT; UT = UT_set(UTo, GHA(UTo, G_sun(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))), glong, e(h, glat, sun_deviation(earth_tilt(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))))); result_set(UT, UTo, glong, glat, year, month, date); } return UT; } // 求时区
public static int Zone(double glong) { if (glong >= 0) return (int) ((int) (glong / 15.0) + 1); else return (int) ((int) (glong / 15.0) - 1); } // 日出
public static String getSunrise(BigDecimal longitude, BigDecimal latitude, Date sunTime) {
if (sunTime != null && longitude != null && latitude != null) {
double sunrise, glong, glat;
int year, month, date;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateTime = sdf.format(sunTime);
String[] rq = dateTime.split("-");
String y = rq[0];
String m = rq[1];
String d = rq[2];
year = Integer.parseInt(y);
if (m != null && m != "" && m.indexOf("0") == -1) {
m = m.replaceAll("0", "");
}
month = Integer.parseInt(m); date = Integer.parseInt(d); glong = longitude.doubleValue(); glat = latitude.doubleValue(); sunrise = result_rise(UT_rise(UTo, GHA(UTo, G_sun(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))), glong, e(h, glat, sun_deviation(earth_tilt(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))))), UTo, glong, glat, year, month, date); return (int) (sunrise / 15 + 8) + ":" + (int) (60 * (sunrise / 15 + 8 - (int) (sunrise / 15 + 8)));
}
return null;
} // 日落
public static String getSunset(BigDecimal longitude, BigDecimal latitude, Date sunTime) {
if (sunTime != null && latitude != null && longitude != null) {
double sunset, glong, glat;
int year, month, date;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateTime = sdf.format(sunTime);
String[] rq = dateTime.split("-");
String y = rq[0];
String m = rq[1];
String d = rq[2];
year = Integer.parseInt(y);
if (m != null && m != "" && m.indexOf("0") == -1) {
m = m.replaceAll("0", "");
}
month = Integer.parseInt(m); date = Integer.parseInt(d); glong = longitude.doubleValue(); glat = latitude.doubleValue(); sunset = result_set(UT_set(UTo, GHA(UTo, G_sun(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))), glong, e(h, glat, sun_deviation(earth_tilt(t_century(days(year, month, date), UTo)), ecliptic_longitude(L_sun(t_century(days(year, month, date), UTo)), G_sun(t_century(days(year, month, date), UTo)))))), UTo, glong, glat, year, month, date); return (int) (sunset / 15 + 8) + ":" + (int) (60 * (sunset / 15 + 8 - (int) (sunset / 15 + 8)));
}
return null;
} /**
* 将当前时间转换为16进制
*
* @return
*/
public static String getTimeTo16(String time) {
Date date = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = formatter.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
//Date格式
Long t = date.getTime() / 1000;
String hexString = Long.toHexString(t);
System.out.println("十六进制:" + hexString); return hexString;
} //将指定时间转换成 date 格式
public static Date getTime(String time) {
Date date = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); //日期
try {
date = formatter.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
} public static void main(String[] args) {
System.out.println(SunRiseSet.getSunrise(new BigDecimal(108.94359),new BigDecimal(34.352276),new Date()));
System.out.println(SunRiseSet.getSunset(new BigDecimal(108.94359),new BigDecimal(34.352276),new Date()));
}
}

java获取日出日落时间的更多相关文章

  1. java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

    一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start= ...

  2. java获取前一天时间SimpleDateFormat,java判断某个时间段

    java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...

  3. Java获取系统时间少了八个小时

    Java获取系统时间少了八个小时 今天忽然遇到需要获取当前时间的问题,我向来谨慎,先测试获取到的系统时间是否正确,结果竟然发现少了八个小时,晕死了,记得之前在页面用javascript获取过当前时间, ...

  4. java 获取当前时间,前一天时间

    java获取当前时间,并按一定格式输出 1.用Calendar获取Date Calendar calendar=Calendar.getInstance(); SimpleDateFormat for ...

  5. android java获取当前时间的总结

    import   java.text.SimpleDateFormat; SimpleDateFormat   formatter   =   new   SimpleDateFormat   (&q ...

  6. java获取当前日期时间代码总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值.  方法如下: 要使用 java.util.Date .获取当前时间的代码如下  代码如下 复制代码 Date date = new ...

  7. Java获取指定时间的毫秒值的方法

    有以下两种方法获取指定时间的毫秒值: 1.Calendar类 先由getInstance获取Calendar对象,然后用clear方法将时间重置为(1970.1.1 00:00:00),接下来用set ...

  8. Java 获取当前时间及实现时间倒计时功能

    引言 在一些项目中或是一些特殊的业务场景中,需要用到显示系统的当前时间,以及一些固定的时间倒计时,时间到后做一些什么事情的业务 .接下来咱们就具体看看代码是怎么实现的: <%@ page lan ...

  9. JAVA获取当前时间加一天

    01.获取当前时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return df.for ...

随机推荐

  1. css--flex弹性布局详解和使用

    前言 前端开发最基础的能力是根据 ui 设计稿迅速还原页面,拿到设计稿不要急于写代码,首先要对页面进行分析,对页面的整体布局有个大概的了解,然后先实现一个整体的布局,再把布局拆分成逐个小模块,逐个去实 ...

  2. gRPC(3):拦截器

    在 gRPC 调用过程中,我们可以拦截 RPC 的执行,在 RPC 服务执行前或执行后运行一些自定义逻辑,这在某些场景下很有用,例如身份验证.日志等,我们可以在 RPC 服务执行前检查调用方的身份信息 ...

  3. 1、springboot2新建web项目

    1.添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...

  4. 4shell中的特殊变量

    1.位置参数 2.其他特殊变量 2.1 用法举栗 2.2 $* 和 $@ 的区别 2.3 $?的用法 1.位置参数 运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 ...

  5. leetcode 字符串转换整数 (模拟)

    思路分析 1.跟着题意模拟,分成几种情况来看待 2.一种全是空格 3.有可能有空格,然后有符号的 4.有可能有空格,无符号数字 5.有可能有空格,非数字开头 6.最后还需要考虑一个越界的问题,所以要除 ...

  6. 使用xcode实现IM的那些坑

    想用xcode基于XMPP实现即时通讯,mac必须安装openfire(xmpp服务器),mysql(本地数据库,用于配置openfire),JDK(打开openfire必须本地具备java环境),x ...

  7. 从源码分析Hystrix工作机制

    一.Hystrix解决了什么问题? 在复杂的分布式应用中有着许多的依赖,各个依赖都有难免在某个时刻失败,如果应用不隔离各个依赖,降低外部的风险,那容易拖垮整个应用. 举个电商场景中常见的例子,比如订单 ...

  8. 前端-Vue基础1

    Vue核心思想:只要改变数据,页面就会发生改变 1.引入vue 1.下载vue.js 2.在script标签的src属性中,引入vue.js <script src="js/vue.j ...

  9. JM操作数据库

    [前言] 为什么要去直连数据库,去操作数据库? 因为在我们做自动化的时候,或者在大批量准备数据的时候,自动化的时候有时候会生成很多条页面上,接口上无法删除的数据,那么就很有很多的测试数据遗留在系统上, ...

  10. python adb 关闭拼多多

    def gbpdd(sjh): aaka="adb -s {0} shell am force-stop com.xunmeng.pinduoduo".format(sjh) aa ...