目录

前言

一、节气和季节知识小课堂

1、节气是什么

2、季节是什么

3、节气和季节的关系

二、PostgreSQL数据库设计

1、信息存储

2、数据示例

3、SQL查询

三、JAVA计算节气和季节

1、模型层查询接节气

2、根据节气反推季节

3、节气及季节检索

四、总结


前言

        在当今数字化时代,信息检索技术在各个领域都发挥着至关重要的作用。从简单的网页搜索到复杂的数据库查询,检索技术的高效性和准确性直接影响着用户体验和工作效率。在众多检索领域中,对自然现象的检索,如节气与季节的检索,虽然看似简单,却蕴含着丰富的文化内涵和实用价值。

        节气是中国古代农耕文明的智慧结晶,它将一年分为二十四个节气,每个节气大约15天。这些节气不仅反映了自然界的气候变化,还与农业生产、民俗文化等密切相关。例如,“立春”标志着春天的开始,是播种的季节;“冬至”则是一年中白天最短、夜晚最长的日子,有着丰富的民俗活动。季节的划分则是更宏观的时间单位,通常分为春、夏、秋、冬四季,每个季节大约三个月。季节的变化影响着人们的日常生活、农业生产以及自然生态系统的平衡。

        随着信息技术的发展,人们对于节气与季节信息的需求不再局限于传统的日历和书籍。一个高效、便捷的检索系统能够帮助用户快速获取与节气和季节相关的信息,无论是了解某个节气的习俗,还是查询某个季节的气候特征,都能在短时间内得到满足。这不仅有助于传承和弘扬传统文化,还能为现代生活提供实用的参考。

        本文将探讨如何利用Java与PostgreSQL的融合,实现一个高效、准确且具有文化价值的节气与季节检索系统。通过Java与PostgreSQL的融合,我们成功实现了一个节气与季节检索系统。这个系统不仅能够快速、准确地检索到用户所需的信息,还具有良好的用户体验。它为用户提供了了解节气与季节的便捷途径,有助于传承和弘扬传统文化,同时也为现代生活提供了实用的参考。

一、节气和季节知识小课堂

        关于节气和季节大家多少都能说上一些内容,那么这里我们依然还是简单给大家讲讲节气和季节的知识,当然作为技术人员,许多的知识点没那么详细,主要是为了在进行下一个主题的介绍时,能有一个基本的知识共识。

1、节气是什么

        节气是中国古代农耕文明的智慧结晶,是根据太阳在黄道上的位置划分的。一年分为二十四个节气,每个节气大约15天。这些节气不仅反映了自然界的气候变化,还与农业生产、民俗文化等密切相关。例如,“立春”标志着春天的开始,是播种的季节;“冬至”则是一年中白天最短、夜晚最长的日子,有着丰富的民俗活动。每个节气都有其独特的气候特征和文化内涵。例如,“惊蛰”时,春雷初响,惊醒冬眠中的昆虫;“芒种”时,麦子成熟,需要及时收割。节气的变化提醒着人们关注自然,顺应自然规律,安排农事活动和生活起居。节气的划分体现了中国古代人民对自然规律的深刻理解和尊重,是中国传统文化的重要组成部分。

2、季节是什么

        季节是根据地球绕太阳公转的轨道位置和地球自转轴的倾斜角度划分的,通常分为春、夏、秋、冬四季,每个季节大约三个月。季节的变化主要体现在气候特征上,如春季温暖湿润,夏季炎热多雨,秋季凉爽干燥,冬季寒冷少雨。这些气候特征影响着自然生态系统的平衡,也决定了人们的日常生活和农业生产。例如,春季是万物复苏的季节,适合播种和植树;夏季是生长的季节,农作物快速生长,人们需要防暑降温;秋季是收获的季节,农作物成熟,人们忙着收割;冬季是休养生息的季节,人们需要保暖和储备食物。季节的划分是人们根据长期的自然观察和生活经验总结出来的,是人类适应自然环境的重要方式之一。

3、节气和季节的关系

        节气和季节虽然都是时间的划分方式,但它们之间存在着密切的关系。节气是季节的细分,二十四个节气分布在四季之中,每个季节包含六个节气。例如,春季包括立春、雨水、惊蛰、春分、清明和谷雨;夏季包括立夏、小满、芒种、夏至、小暑和大暑;秋季包括立秋、处暑、白露、秋分、寒露和霜降;冬季包括立冬、小雪、大雪、冬至、小寒和大寒。节气的变化更细致地反映了季节内的气候变化和自然现象,为人们提供了更精确的时间参考。同时,节气和季节的划分都与农业生产密切相关,它们共同指导着农民的农事活动。例如,在春季的立春时节,农民开始准备春耕;在夏季的芒种时节,农民忙着收割小麦并播种水稻。节气和季节的结合,不仅体现了中国古代人民对自然规律的深刻理解,也展现了他们对农业生产的科学安排。两者相辅相成,共同构成了中国古代时间观念的重要组成部分。关于节气和季节的关系,可以看下面这张图:

        这其中就表示季节的节气组成,一年有四季,而每个季节又有六个节气,如此循环反复,让我们周而复始,生生不息。这是按照我国传统的四季的划分,这里无异于进行四季的具体的划分,仅从一种角度进行划分。有了这个数据基础之后,下面我们就如何表示季节和节气的关系进行PostgreSQL数据库进行设计和实现。

二、PostgreSQL数据库设计

        我们来看看2025年的全年节气信息表,可以通过搜索引擎或者大模型进行输出,通过万年历也可以的,下面分享一个来自kimi的2025年节气与时间关系:

('立春', '2025-02-04'),('雨水', '2025-02-19'),('惊蛰', '2025-03-05'),
('春分', '2025-03-20'),('清明', '2025-04-04'),('谷雨', '2025-04-20'),
('立夏', '2025-05-05'),('小满', '2025-05-21'),('芒种', '2025-06-05'),
('夏至', '2025-06-21'),('小暑', '2025-07-07'),('大暑', '2025-07-23'),
('立秋', '2025-08-07'),('处暑', '2025-08-23'),('白露', '2025-09-08'),
('秋分', '2025-09-23'),('寒露', '2025-10-08'),('霜降', '2025-10-23'),
('立冬', '2025-11-07'),('小雪', '2025-11-22'),('大雪', '2025-12-07'),
('冬至', '2025-12-21'),('小寒', '2026-01-05'),('大寒', '2026-01-20');

        仔细看以上信息是比较简单的,这里我们以PostgreSQL数据库为例,重点讲解如何在数据层,PostgreSQL数据库被用来存储节气与季节的相关数据。这些数据包括节气的名称、日期、习俗描述等。通过合理设计数据库表结构和索引,确保数据的存储和检索效率,以年度为例,只需要存储24条记录即可,数据的量不是很大,在现实中时可以接受的。

1、信息存储

        存储节气信息的表结构脚本如下:

/*==============================================================*/
/* Table: biz_solarterms                                        */
/*==============================================================*/
create table biz_solarterms (
   pk_id                INT8                 not null,
   solar_term           VARCHAR(5)           not null,
   solar_date           TIMESTAMP            not null,
   constraint PK_BIZ_SOLARTERMS primary key (pk_id)
);
comment on table biz_solarterms is
'节气时间信息表,用于存储节气及其对应的日期';
comment on column biz_solarterms.pk_id is
'主键';
comment on column biz_solarterms.solar_term is
'节气信息';
comment on column biz_solarterms.solar_date is
'节气日期';

        以上是节气对应日期信息表,该表是计算节气的核心表。

2、数据示例

        接下来,我们模拟将2025年的全年的节气信息与其时间信息录入到数据库中,这里提供快速的录入SQL脚本:

INSERT INTO biz_solarterms (pk_id,solar_term, solar_date) VALUES
(1,'立春', '2025-02-04'),(2,'雨水', '2025-02-19'),(3,'惊蛰', '2025-03-05'),
(4,'春分', '2025-03-20'),(5,'清明', '2025-04-04'),(6,'谷雨', '2025-04-20'),
(7,'立夏', '2025-05-05'),(8,'小满', '2025-05-21'),(9,'芒种', '2025-06-05'),
(10,'夏至', '2025-06-21'),(11,'小暑', '2025-07-07'),(12,'大暑', '2025-07-23'),
(13,'立秋', '2025-08-07'),(14,'处暑', '2025-08-23'),(15,'白露', '2025-09-08'),
(16,'秋分', '2025-09-23'),(17,'寒露', '2025-10-08'),(18,'霜降', '2025-10-23'),
(19,'立冬', '2025-11-07'),(20,'小雪', '2025-11-22'),(21,'大雪', '2025-12-07'),
(22,'冬至', '2025-12-21'),(23,'小寒', '2026-01-05'),(24,'大寒', '2026-01-20');

        以上为演示数据,有的节气日期不一定准确,请大家按实际情况进行修改录入。

3、SQL查询

        有了这些数据之后,我们如何指定一个日期比如某天,它究竟是在哪个节气当中呢?这里就需要需要数据库查询来简化操作,这里提供一种查询思路,SQL查询语句如下:

WITH ordered_terms AS (
    SELECT solar_term, solar_date,
           LEAD(solar_date) OVER (ORDER BY solar_date) AS next_date
    FROM biz_solarterms
)
SELECT solar_term, solar_date, next_date
FROM ordered_terms 
WHERE to_date('2025-09-10','YYYY-MM-DD') >= solar_date
  AND (to_date('2025-09-10','YYYY-MM-DD') < next_date OR next_date IS NULL);

        这里需要使用with语句来进行查询嵌套,在参数中指定查询日期后就可以查询到当前日期到底属于哪个节气。比如以上SQL在客户端软件中执行之后,可以看到如下结果:

solar_term	solar_date	next_date
白露	2025-09-08 00:00:00	2025-09-23 00:00:00

        查询结果表明,2025-09-10在白露节气当中,白露的开始日期是9月8日,到9月23日结束。有了SQL的查询结果之后,下面我们结合JAVA来讲讲结合PostgreSQL数据库如何来求解季节信息。

三、JAVA计算节气和季节

        在众多编程语言和数据库管理系统中,Java和PostgreSQL的组合是一个理想的选择。Java是一种广泛使用的高级编程语言,具有跨平台性、面向对象、多线程等优点。它强大的功能和丰富的库支持,使得开发复杂的应用程序变得相对容易。PostgreSQL则是一种开源的对象关系型数据库管理系统,以其高性能、高可靠性和强大的功能而闻名。它支持复杂的查询,能够高效地处理大量数据,非常适合用于存储和检索节气与季节信息。在应用开发中,我们通常使用Java来进行应用开发,因此这里我们重点讲讲如何使用Java来计算节气和季节。

1、模型层查询接节气

        模型层的定义比较简单,这里贴出数据库查询Mapper类的主要代码:

package com.yelang.project.extend.earthquake.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.SolarTerms;
/**
 * - 节气时间信息mapper接口
 * @author 夜郎king
 */
public interface SolarTermsMapper extends BaseMapper<SolarTerms>{
	static final String FIND_SOLARTERMS_BYDATE = "<script>"
			+ " WITH ordered_terms AS ( SELECT solar_term, solar_date,LEAD(solar_date) OVER (ORDER BY solar_date) AS next_date "
			+ " FROM biz_solarterms ) SELECT solar_term, solar_date, next_date FROM ordered_terms "
			+ " <![CDATA[ WHERE to_date(#{queryDate},'YYYY-MM-DD') >= solar_date AND (to_date(#{queryDate},'YYYY-MM-DD') < next_date OR next_date IS NULL) ]]> "// 需要增加转义
			+ "</script>";
	/**
	 * - 根据日期查询所处节气   add by 夜郎king in 2025-09-10
	 * @param queryDate查询日期
	 * @return 该时间所处的节气信息
	 */
	@Select(FIND_SOLARTERMS_BYDATE)
	SolarTerms findSolarTermsByDate(@Param("queryDate")String queryDate);
}

        这里需要注意的是,由于这里有时间的判断查询,因此我们引入格式化的标签,以方便>和<这种符号能正常解析使用。

2、根据节气反推季节

根据前面的知识可以知晓,季节与节气其实有一个对应关系的,在前面的图中有明确的表示,那么如何使用Java来进行计算呢?比如我们已经使用前面的方法查询出指定日期属于哪个节气,那么如何通过节气推出季节呢?可以看看下面的核心代码:

@Override
public String getSeason(String solarTerm) {
		switch (solarTerm) {
		case "立春":
		case "雨水":
		case "惊蛰":
		case "春分":
		case "清明":
		case "谷雨":
			return "春季";
		case "立夏":
		case "小满":
		case "芒种":
		case "夏至":
		case "小暑":
		case "大暑":
			return "夏季";
		case "立秋":
		case "处暑":
		case "白露":
		case "秋分":
		case "寒露":
		case "霜降":
			return "秋季";
		case "立冬":
		case "小雪":
		case "大雪":
		case "冬至":
		case "小寒":
		case "大寒":
			return "冬季";
		default:
			return "未知";
		}
}

3、节气及季节检索

        最后使用Junit程序来测试一下以上的程序是否可靠,是否按照我们的预期进行查询和展示。首先分享查询调用方法:

package com.yelang.project.date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.yelang.project.extend.earthquake.domain.SolarTerms;
import com.yelang.project.extend.earthquake.service.ISolarTermsService;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SolarTermSeasonDbCase {
	@Autowired
	private ISolarTermsService solarTermsService;
	@Test
	public void testGetSolar() {
		SolarTerms solarTerms = solarTermsService.findSolarTermsByDate("2025-07-10");
		System.out.println(solarTerms);
		System.out.println(solarTermsService.getSeason(solarTerms.getSolarTerm()));
		solarTerms = solarTermsService.findSolarTermsByDate("2025-10-08");
		System.out.println(solarTerms);
		System.out.println(solarTermsService.getSeason(solarTerms.getSolarTerm()));
		solarTerms = solarTermsService.findSolarTermsByDate("2025-11-23");
		System.out.println(solarTerms);
		System.out.println(solarTermsService.getSeason(solarTerms.getSolarTerm()));
	}
}

        这里模拟了三个不同的日期,以验证计算的效果是正确,在IDE中运行以上程序后,在控制台中可以看到以下输出:

        至此,基于Java进行季节和节气的计算就基本完成,可以正常的进行日期的转换,同时经过万年历等验证,基本是正确的。

四、总结

        以上就是本文的主要内容,通过Java与PostgreSQL的融合,成功实现了一个节气与季节检索系统。这个系统不仅能够快速、准确地检索到用户所需的信息,还具有良好的用户体验。在未来的工作中,我们计划进一步优化系统的性能,增加更多的功能,如用户自定义查询、数据可视化等。我们还将探索与其他技术的结合,如人工智能和大数据分析,以进一步提升系统的智能化水平。我们相信,随着技术的不断发展和创新,节气与季节检索系统将为更多的人带来便利和价值。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐