java 采用单例模式计算当年有多少个周,并列出所有周以及每一个周所对应的时间段(内含注释)
根据给定文件的信息,本文将详细解析如何使用Java语言及单例模式来计算并列出一年中的所有周及其对应的时间段,同时也会展示如何获取当前日期及其所在周。 ### 一、单例模式简介 单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在本示例中,`CycleDate` 类采用了单例模式,确保在整个程序运行过程中只有一个 `CycleDate` 实例存在,这样可以避免多个实例导致的数据不一致问题。 ### 二、日期与时间处理 #### 1. **日期处理类** 在Java中,处理日期和时间主要依赖于以下几个类: - `java.util.Calendar`: 提供了对日期和时间进行操作的方法。 - `java.util.GregorianCalendar`: 是 `Calendar` 的具体实现类,用于处理公历日期。 - `java.sql.Date`: 代表SQL数据库中的日期值。 - `java.text.DateFormatSymbols`: 用于获取特定的日历系统中显示日期和时间所需的符号表。 #### 2. **关键方法解析** - **`init()` 方法**: 此方法负责初始化每年的周数据。它首先创建了一个从年初到年末的时间范围,然后遍历这些日期,找出每周的开始日期,并存储在数组中。每个周的描述也保存在一个字符串数组中。 - 使用 `Calendar.getInstance().get(Calendar.YEAR)` 获取当前年份。 - 使用 `c_begin.set(year, month, day)` 和 `c_end.set(year, month, day)` 设置起始日期和结束日期。 - 利用 `c_begin.add(Calendar.DAY_OF_YEAR, 1)` 循环遍历每一天。 - 当检测到星期一时,将该日期作为该周的开始日期,并记录下来。 - **`getInstance()` 方法**: 这是单例模式的核心方法,确保 `CycleDate` 类只有一个实例。如果尚未创建实例,则创建一个新的实例;否则返回已有的实例。 ### 三、核心代码解读 #### 1. **初始化与计算** ```java public void init(){ // 初始化起始日期和结束日期 Calendar c_begin = new GregorianCalendar(); Calendar c_end = new GregorianCalendar(); DateFormatSymbols dfs = new DateFormatSymbols(); String[] weeks = dfs.getWeekdays(); // 设置起始日期为当年的第一天 c_begin.set(Calendar.getInstance().get(Calendar.YEAR), 1, 1); // 设置结束日期为当年的最后一天 c_end.set(Calendar.getInstance().get(Calendar.YEAR), 12, 31); int count = 1; // 遍历每一天 while (c_begin.before(c_end)) { java.sql.Date theDate = new java.sql.Date(c_begin.getTime().getTime()); // 检测是否为周一 if (weeks[c_begin.get(Calendar.DAY_OF_WEEK)].equals("一")) { theWeek[count] = theDate; weekDesc[count] = "" + count + "周" + theDate + "至" + new java.sql.Date(c_begin.getTime().getTime() + 24 * 3600 * 1000 * 6); System.out.println(weekDesc[count]); } // 如果是周日则增加周计数器 if (c_begin.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { count++; } // 下一天 c_begin.add(Calendar.DAY_OF_YEAR, 1); } sumWeeds = count; System.out.println("总共有:" + sumWeeds + "周"); } ``` #### 2. **获取当前日期及其所在周** - **`getNowDate()` 方法**: 返回当前日期。 - **`getNowWeek()` 方法**: 返回当前日期所在的一年的第几周。 ```java public static Date getNowDate() { Calendar calendar = Calendar.getInstance(); return new Date(calendar.getTimeInMillis()); } public static int getNowWeek() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.WEEK_OF_YEAR) + 1; } ``` ### 四、总结 通过以上分析可以看出,该程序利用了Java的日期处理功能和单例模式来实现了计算并列出一年中所有周及其对应的时间段的功能。这种方法不仅可以用于统计当前年份的信息,还可以轻松地扩展到其他年份或月份的计算需求。此外,通过单例模式的应用,确保了数据的一致性和准确性。































import java.sql.Date;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import com.mis.database.exception.ApplicationException;
public class CycleDate {
private static CycleDate instance; //单例对象
private int sumWeeds = 0; //今年一共有多少周
private String[] weekDesc = new String[70]; //每一个参数代表当前周数以及所对应的时间段的字符串
private java.sql.Date[] theWeek = new java.sql.Date[70]; //每一参数都为星期一的日期
public CycleDate() {
init();
}
/**
* 单例模式,加死锁控制,减少不必要的内存消耗
* @return
* @throws ApplicationException
*/
public synchronized static CycleDate getInstance() throws Exception{
if(instance == null){
instance = new CycleDate();
}
return instance;
}


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于AT89S52单片机的数字温度计设计.doc
- 2023年初级通信工程师考试试题及答案.doc
- 软件项目立项评审报告模版.doc
- 项目管理-系列2-3:配置管理实用手册vss.docx
- 家里怎么安装网络.pdf
- 工业机器人遥操作控制系统设计嵌入式伺服控制器设计样本.doc
- 精品课程网络教学资源和硬件环境.pdf
- 发电系统安全控制.doc
- 网络诈骗常见手段及防范对策.doc
- 计算机组成原理习题)(1)解析.doc
- 电子商务和税收筹划的关系是什么.doc
- 再生资源回收体系建设项目管理手册.doc
- 国家网络安全法考试试题与答案.pdf
- 软件测试实验报告.doc
- 数据库课程设计宾馆客房信息管理系统.doc
- 网络推广最高效率的方案.doc


