运用Java及SunriseSunsetCalculator,探寻长沙市的理论日照时长

运用Java及SunriseSunsetCalculator,探寻长沙市的理论日照时长

目录

前言

一、理论日照时长简介

1、理论日照时长计算

2、理论日照时长数学计算

二、SunriseSunsetCalculator求解

1、SunriseSunsetCalculator引入

2、时区计算设置

3、理论时长计算

4、完整的代码及日常统计

三、总结


前言

        在地理学与气象学的研究领域,日照时长一直是备受关注的重要指标。它不仅与地球的自转、公转以及大气环流等诸多自然因素紧密相连,更对人类的生产生活有着深远的影响。从农作物的生长周期到太阳能资源的开发利用,从城市的规划布局到居民的健康生活,日照时长都扮演着不可或缺的角色。而长沙市,作为湖南省的省会城市,以其独特而复杂的地理环境和气候特征,其日照时长的研究具有重要的现实意义和学术价值。

        长沙市地处中国南方,属于亚热带季风气候区。这里四季分明,降水充沛,但同时也存在着云层覆盖多、日照时间相对较短等特点。随着城市化进程的加速和经济的快速发展,对于日照时长的精准把握需求日益迫切。一方面,城市规划者需要了解日照时长的分布规律,以合理规划城市建筑布局,确保居民住宅和公共设施能够获得充足的阳光照射;另一方面,农业部门需要依据日照时长来优化农作物种植结构,提高农业生产效益;此外,对于太阳能光伏发电等新能源产业而言,准确的日照时长数据更是其项目规划和效益评估的关键依据。传统的日照时长测量方法往往依赖于地面气象观测站的实测数据,这些数据虽然具有一定的准确性,但存在空间分辨率低、观测站点分布不均等问题,难以满足精细化研究和应用的需求。在这种背景下,借助先进的计算技术和科学算法,通过理论计算来获取更全面、更精准的日照时长数据成为了一种可行且高效的方法。

        本研究旨在运用Java编程语言结合SunriseSunsetCalculator工具,对长沙市的理论日照时长进行全面而深入的探讨。我们将首先详细介绍Java语言在本研究中的应用优势以及SunriseSunsetCalculator的工作原理和使用方法,为后续的计算过程奠定坚实的基础。接着,通过对长沙市地理坐标的精确获取和不同季节、不同日期的日照时长计算,分析长沙市日照时长的季节变化规律和年际变化趋势。

一、理论日照时长简介

        本节将重点介绍理论日照时长的基本知识,包括理论日照时长的概念以及相关的数学计算方法。让大家对理论日照时长有一个基本的了解。

1、理论日照时长计算

        以下引自百度百科,对于日照时数的简介:

        这里我们不进行严谨的计算,使用朴素的文字进行表达,在不考虑云层、天气地形的情况下。通常将日出和日落时间表示为一天中的时间(例如,使用24小时制)。为了计算日照时长,我们需要将日落时间减去日出时间。但是,由于时间可能是跨过午夜的形式(例如,日出在早上,日落在同一天的晚上),我们通常假设日出和日落都在同一天内,所以直接相减即可。

2、理论日照时长数学计算

        这里我们不考虑跨日的时间处理,都是同一天进行时长计算。这里我们对时长信息计算进行简单的介绍。

         假设:

n

为一年中的总天数(365或366);

        

t_{sunrise}\left ( i \right )

为第 

\mathbf{i}

天的日出时间;

        

t_{sunset}\left ( i \right )

为第 

\mathbf{i}

天的日落时间;

        

d\left ( i \right )

为第

\mathbf{i}

天的日照时长;

        则年度日照总时长

S_{year}

的计算公式为:

        请记住以上的计算方法,下面我们将根据这个公式来求解某地的全年理论日照时长。

二、SunriseSunsetCalculator求解

        Java作为一种广泛使用的编程语言,以其强大的功能、跨平台性和丰富的类库支持,在众多领域都有着广泛的应用。而SunriseSunsetCalculator(日出日落计算器)是一个基于Java开发的开源工具,它能够根据给定的地理位置和日期,精确计算出日出、日落以及昼夜时长等天文数据。这为我们在理论上计算长沙市的日照时长提供了一个有力的工具。通过将长沙市的地理坐标输入到SunriseSunsetCalculator中,我们可以快速获取到不同日期的日出和日落时间,进而计算出理论上的日照时长。

1、SunriseSunsetCalculator引入

        为了实现理论日照时长的计算,首先我们要进行日出和日落时间的准确计算。在Java中要想使用SunriseSunsetCalculator来进行时间求解,首先在Maven工程中引入如下资源:

<!-- 增加日出和日落计算包 add by 夜郎king --> <dependency> <groupId>com.luckycatlabs</groupId> <artifactId>SunriseSunsetCalculator</artifactId> <version>1.2</version> </dependency> <!-- 增加日出和日落计算包 add by 夜郎king-->

2、时区计算设置

        为了方便统一计算,这里我们统一使用北京时间所在时区进行统一计算。众所周知,时区与目标点的经度息息相关,因此在对目标点的计算中,我们可以直接将经纬度导入到计算组件中,核心代码如下:

//长沙的经纬度 Location location = new Location("28.201916", "112.968047");

        然后传入SunriseSunsetCalculator组件中进行初始化,代码如下:

 SunriseSunsetCalculator calculator = new SunriseSunsetCalculator(location, "Asia/Shanghai");

        计算单日的日出和日落时间的方法如下:

Calendar date = Calendar.getInstance(); String officialSunrise = calculator.getOfficialSunriseForDate(date); Calendar officialSunset = calculator.getOfficialSunsetCalendarForDate(date); System.out.println(officialSunrise); System.out.println(officialSunset); System.out.println(calculator.getOfficialSunsetForDate(date));

        在实际计算过程中,我们需要循环遍历全年的日期来完成计算。

3、理论时长计算

        第一步:时间转换。在此次计算当中,我们首先需要将年月日转换成日历对象,才能传给日出日落组件进行计算。核心代码如下:

LocalDate localDate = LocalDate.of(year, month, day); // 将LocalDate转换为ZonedDateTime ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); // 将ZonedDateTime转换为Instant Instant instant = zonedDateTime.toInstant(); // 将Instant转换为Date Calendar date = Calendar.getInstance(); date.setTime(Date.from(instant));

        第二步:日出日落计算。在前面一节的理论介绍中,我们介绍了数学基础。理论日照时长是日落时间减去日出时间,因此这里我们需要将组件计算返回Calendar对象才能进行计算,计算方法如下:

Calendar officialSunrise = calculator.getOfficialSunriseCalendarForDate(date); Calendar officialSunset = calculator.getOfficialSunsetCalendarForDate(date);

        第三步:计算时间差。将得到的日落时间和日出时间的日历对象之后,需要将时间转换成以小时为单位的计算,因此需要进行转换,转换的代码比较简单,这里直接给出:

// 计算时间差(以毫秒为单位) long differenceInMillis = officialSunset.getTime().getTime() - officialSunrise.getTime().getTime(); // 将毫秒转换为小时 double differenceInHours = differenceInMillis / (1000.0 * 60 * 60); // 累加年度总日照时长 totalDurationInHours += differenceInHours;

        第四步:格式化输出。为了方便用户进行查看展示,我们需要在结果中对日出日落信息进行格式化输出。关键代码如下:

// 格式化输出 sunriseSunsetEvents.add(localDate + " 日出时间: " + sunriseStr + ", 日落时间: " + sunsetStr + ", 理论日照时长: " + String.format("%.2f", differenceInHours) + " 小时");

4、完整的代码及日常统计

        这里给出完整的日照时长求解代码,包括年月日的自动生成以及对长沙市进行2025年全年的理论日常时长统计。核心代码如下:

package com.yelang.project.sunrisesunsetcalculator; import com.luckycatlabs.sunrisesunset.SunriseSunsetCalculator; import com.luckycatlabs.sunrisesunset.dto.Location; import com.yelang.common.utils.StringUtils; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class SunriseSunsetExample { public static void main(String[] args) { //长沙的经纬度 Location location = new Location("28.201916", "112.968047"); SunriseSunsetCalculator calculator = new SunriseSunsetCalculator(location, "Asia/Shanghai"); // 获取当前年份 int year = LocalDate.now().getYear(); // 存储一年的日出、日落和日照时长 List<String> sunriseSunsetEvents = new ArrayList<>(); // 累加年度总日照时长 double totalDurationInHours = 0.0; // 遍历一年的每一天 for (int month = 1; month <= 12; month++) { for (int day = 1; day <= LocalDate.of(year, month, 1).lengthOfMonth(); day++) { LocalDate localDate = LocalDate.of(year, month, day); // 将LocalDate转换为ZonedDateTime ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); // 将ZonedDateTime转换为Instant Instant instant = zonedDateTime.toInstant(); // 将Instant转换为Date Calendar date = Calendar.getInstance(); date.setTime(Date.from(instant)); String sunriseStr = calculator.getOfficialSunriseForDate(date); Calendar officialSunrise = calculator.getOfficialSunriseCalendarForDate(date); Calendar officialSunset = calculator.getOfficialSunsetCalendarForDate(date); String sunsetStr = calculator.getOfficialSunsetForDate(date); // 计算时间差(以毫秒为单位) long differenceInMillis = officialSunset.getTime().getTime() - officialSunrise.getTime().getTime(); // 将毫秒转换为小时 double differenceInHours = differenceInMillis / (1000.0 * 60 * 60); // 累加年度总日照时长 totalDurationInHours += differenceInHours; // 格式化输出 sunriseSunsetEvents.add(localDate + " 日出时间: " + sunriseStr + ", 日落时间: " + sunsetStr + ", 理论日照时长: " + String.format("%.2f", differenceInHours) + " 小时"); } } // 输出每天的结果 sunriseSunsetEvents.forEach(System.out::println); // 输出年度总日照时长 System.out.println("\n年度总日照时长: " + String.format("%.2f", totalDurationInHours) + " 小时"); } }

        在IDE中运行以上代码后,可以看到以下的内容输出:

2025-11-07 日出时间: 06:43, 日落时间: 17:40, 理论日照时长: 10.95 小时 2025-11-08 日出时间: 06:44, 日落时间: 17:39, 理论日照时长: 10.92 小时 2025-11-09 日出时间: 06:45, 日落时间: 17:39, 理论日照时长: 10.90 小时 2025-11-10 日出时间: 06:46, 日落时间: 17:38, 理论日照时长: 10.87 小时 2025-11-11 日出时间: 06:46, 日落时间: 17:37, 理论日照时长: 10.85 小时 2025-11-12 日出时间: 06:47, 日落时间: 17:37, 理论日照时长: 10.83 小时 2025-11-13 日出时间: 06:48, 日落时间: 17:36, 理论日照时长: 10.80 小时 2025-11-14 日出时间: 06:49, 日落时间: 17:36, 理论日照时长: 10.78 小时 2025-11-15 日出时间: 06:50, 日落时间: 17:36, 理论日照时长: 10.77 小时 2025-11-16 日出时间: 06:50, 日落时间: 17:35, 理论日照时长: 10.75 小时 2025-11-17 日出时间: 06:51, 日落时间: 17:35, 理论日照时长: 10.73 小时 2025-11-18 日出时间: 06:52, 日落时间: 17:34, 理论日照时长: 10.70 小时 2025-11-19 日出时间: 06:53, 日落时间: 17:34, 理论日照时长: 10.68 小时 2025-11-20 日出时间: 06:53, 日落时间: 17:34, 理论日照时长: 10.68 小时 2025-11-21 日出时间: 06:54, 日落时间: 17:33, 理论日照时长: 10.65 小时 2025-11-22 日出时间: 06:55, 日落时间: 17:33, 理论日照时长: 10.63 小时

        对比一下我们的求解数据,以2025年11月17日为例,我们求解的是6点51分日出,几乎与互联网给出的时间一致,日落时间为17点35,互联网时间则是17点34。基本误差很小了。来看一下长沙市的2025年年度日照时长是多少呢?

2025-12-23 日出时间: 07:16, 日落时间: 17:38, 理论日照时长: 10.37 小时 2025-12-24 日出时间: 07:17, 日落时间: 17:38, 理论日照时长: 10.35 小时 2025-12-25 日出时间: 07:17, 日落时间: 17:39, 理论日照时长: 10.37 小时 2025-12-26 日出时间: 07:18, 日落时间: 17:39, 理论日照时长: 10.35 小时 2025-12-27 日出时间: 07:18, 日落时间: 17:40, 理论日照时长: 10.37 小时 2025-12-28 日出时间: 07:19, 日落时间: 17:40, 理论日照时长: 10.35 小时 2025-12-29 日出时间: 07:19, 日落时间: 17:41, 理论日照时长: 10.37 小时 2025-12-30 日出时间: 07:19, 日落时间: 17:42, 理论日照时长: 10.38 小时 2025-12-31 日出时间: 07:20, 日落时间: 17:42, 理论日照时长: 10.37 小时 年度总日照时长: 4439.42 小时

        可以看到长沙全年的总日照时长为4439.42个小时。当然,以上时间仅为理论时间,不代表实际的日照时长,实际的日照时长与很多因素有关,这里我们采用的最简单的计算方法。

三、总结

        以上就是本文的主要内容,本研究旨在运用Java编程语言结合SunriseSunsetCalculator工具,对长沙市的理论日照时长进行全面而深入的探讨。通过本研究,我们期望能够为长沙市的城市规划、农业生产、新能源开发等提供科学、准确的日照时长数据支持,同时也为其他城市或地区开展类似研究提供一个可借鉴的案例和方法。在当今数字化时代,将先进的计算技术与传统的地理气象研究相结合,无疑将为相关领域的研究和发展带来新的突破和机遇。让我们一起踏上这段运用Java及SunriseSunsetCalculator探寻长沙市理论日照时长的奇妙旅程,揭开自然规律的神秘面纱,为城市的可持续发展贡献一份力量。

Read more

JSP基础1:客户端请求端,前端和后端的联系(半成品)

JSP虽然是20年前的老框架,它的存在是为了讲解前后端不分离,在前端html,css中可以嵌入兼容java后端代码,类似的有vue3 下面的看不懂先跳过 问题如下:request对象 = 后端创建,封装前端发送的数据或请求. 还有哪些对象可以对前后端互相发送的请求做处理.哪些对象可以进行前后端交互 在Java Web开发中,主要使用以下对象处理前后端交互:(JSP很老的框架没必要都学把下面能让你理解前后端交互的学了就行) 对象创建位置主要作用数据流向request服务器端封装请求信息前端→后端response服务器端封装响应信息后端→前端session服务器端维护用户会话双向application服务器端全局共享数据双向Cookie服务器端创建,前端存储小数据持久化双向 选择建议:临时数据传递 → request用户状态保持 → session小数据持久化 → Cookie全局数据共享 → application 以上内容看不懂先跳过 1. "客户端"的含义 在 request 对象的上下文中,"客户端"指的是: * 浏览器(Chrome、Firefox、E

By Ne0inhk
基于 Spring Boot 的 Web 三大核心交互案例精讲

基于 Spring Boot 的 Web 三大核心交互案例精讲

—知识点专栏——JavaEE专栏— 作为 Spring Boot 初学者,理解后端接口的编写和前端页面的交互至关重要。本文将通过三个经典的 Web 案例——表单提交、AJAX 登录与状态管理、以及 JSON 数据交互——带您掌握前后端联调的核心技巧和 Spring Boot 的关键注解。 1. 案例一:表单提交与参数绑定(计算求和) 本案例展示最基础、最传统的 Web 交互方式:HTML 表单提交。 1.1 后端代码:CalcController.java 使用 @RestController 简化接口编写,并通过方法参数接收表单数据。 packagecn.overthinker.springboot;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.

By Ne0inhk
大模型算法岗年薪百万!2025互联网大厂校招薪酬全解析,程序员速收藏

大模型算法岗年薪百万!2025互联网大厂校招薪酬全解析,程序员速收藏

文章详细介绍了2025年互联网大厂校招技术岗位的薪资情况,包括字节跳动、腾讯、阿里巴巴等公司的薪酬结构。核心技术岗位年薪普遍以35万元为起点,优秀者可达50万元以上,AI算法和大模型相关岗位存在显著溢价,部分高端岗位年薪甚至突破百万元。学历背景、岗位方向、工作地点等因素对薪酬水平有重要影响。 要想了解2025互联网大厂校招薪资情况,先来看下图-《2025互联网大厂最新梯队排名》 2025年,互联网行业技术岗位的秋季校园招聘呈现出薪资普遍提升的态势,其中核心技术岗位的年度总包收入多数以35万元为起点,表现优异的SSP级别录用者可达到50万元以上,而专注于人工智能领域的科学家等高端岗位,年薪甚至可突破百万元。 以下为部分代表性互联网企业在2025年秋招中,针对核心技术岗位的薪酬统计。数据来源于网络, 综合了基本工资、绩效、签字费、股票或期权、各类补贴等组成部分,年度总包为税前金额。常见的薪酬结构为15至16薪,薪资基准多以一线城市为依据。 1、【字节跳动】 后端开发 · 普通录用:月薪24K-26K,按15薪计算,年度总包约36W-39W。 · 优先录用:月薪27K-30K,

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 fixnum 解决鸿蒙 Web 与原生端 64 位大整数精度失真难题(精准计算护卫)

Flutter for OpenHarmony: Flutter 三方库 fixnum 解决鸿蒙 Web 与原生端 64 位大整数精度失真难题(精准计算护卫)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的跨平台开发时,你可能会遇到一个诡异的 Bug:同样的 64 位长整数(如 Int64),在鸿蒙原生(Native)模式下运行正常,但编译为 Flutter Web 模式在浏览器运行时,数值却发生了精度漂移或溢出。 1. 产生原因:JavaScript 原生的数字类型实质上是 64 位浮点数,它能安全表示的最大整数只有 53 位( 2 53 − 1 2^{53}-1 253−1)。 2. 后果:大额订单 ID、高精度的金融分位值、或是底层硬件的 64 位地址位,在

By Ne0inhk