java周切分,按照指定weekday为一周的开始

本文介绍如何在Java中实现自定义周概念,以周六为一周的开始,详细阐述了从输入日期计算周号的过程,包括处理跨年情况,并提供了相应代码示例。

目标:扩充周的概念为周六到周五、周四到周三。也即认为一周的开始是周六而不是java默认的周末

输入:start_date,end_date

输出:XX年XX周

首先,周切分

以周六到周五为例,先拿到start_date所在的年份的第一个周六FirstSaturday作为第一周,将start_date向后拨到第一个周六,然后计算start_date与FirstSaturday之间相差了多少天,在整除7即可知道start_date所在的周六是本年的第几周。

end_date的处理与start_date类似,需要注意跨年的情况,将end_date向前拨到第一个周五。

对于FirstSaturday的计算时,注意,不仅要调整年、月、日,还要调整时、分、秒。如果不调整时、分、秒,那么计算出来的FirstSaturday的时分秒将会是当前的时分秒,在计算start_date与FirstSaturday之间相差多少天时,由于采用的是时间戳相减,而时间上不到24小时就会认为不是一天,就会带来误差。具体例子可以看:http://www.cnblogs.com/0201zcr/p/5000977.html

所以FirstSaturday的计算如下:

FirstSaturday = Calendar.getInstance();
FirstSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);//重要!!!
while (FirstSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
       FirstSaturday.add(Calendar.DAY_OF_YEAR, 1);
}

注意跨年的情况。当跨年时,我们需要重新计算FirstSaturday。这里只需要将年份重新变更,比如2015跨2016时,之前FirstSaturday是2015年的第一个周六,那么跨年时,将FirstSaturday改成2016年的第一个周六即可。

具体代码如下:

//计算开始日期是第几周
long beginWeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String beginWeek = String.valueOf(beginWeekNum);
if (beginWeekNum < 10) {
   beginWeek = "0" + beginWeekNum;
}
//计算结束日期是第几周
FistSaturday = Calendar.getInstance();
FistSaturday.set(endCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
     FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
long endWeekNum = (endCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String endWeek = String.valueOf(endWeekNum);
if (endWeekNum < 10) {
    endWeek = "0" + endWeekNum;
}


对于需要计算某段时间内具体每周的周号、每周的开始时间和结束时间的代码,如下:

import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * @author zhaoruixing
 */
public class WeekHelper {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    private static long SevenDay = 604800;

    /**
     * @param startDate
     * @param endDate
     * @param args the command line arguments
     * @return
     */
    public static List<Week> getWeekSplit(Date startDate, Date endDate) {
        ArrayList<Week> WeekList = new ArrayList<>();
        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);
        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);

        Calendar FistSaturday = Calendar.getInstance();
        FistSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
        while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
            FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
        }

        while (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
            startCal.add(Calendar.DAY_OF_YEAR, 1);
        }
        while (endCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY) {
            endCal.add(Calendar.DAY_OF_YEAR, -1);
        }
        System.out.println(sdf.format(startCal.getTime()) + "\t" + sdf.format(endCal.getTime()));
        int startYear = startCal.get(Calendar.YEAR);
        while (startCal.compareTo(endCal) < 0) {
            int endYear = startCal.get(Calendar.YEAR);
            if (startYear < endYear) {
                FistSaturday.set(endYear, Calendar.JANUARY, 1, 0, 0, 0);
                while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                    FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
                }
                startYear = endYear;
            }
            Week everyWeek = new Week();
            long WeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
            String WeekNumStr = String.valueOf(WeekNum);
            if (WeekNum < 10) {
                WeekNumStr = "0" + WeekNum;
            }
            everyWeek.setYear(startCal.get(Calendar.YEAR));
            everyWeek.setWeekBegin(sdf.format(startCal.getTime()));
            startCal.add(Calendar.DATE, 6);
            everyWeek.setWeekEnd(sdf.format(startCal.getTime()));
            everyWeek.setWeekNum(WeekNumStr);
            startCal.add(Calendar.DATE, 1);
            WeekList.add(everyWeek);
        }
        Iterator<Week> iter = WeekList.iterator();
        System.out.println("开始打印");
        while (iter.hasNext()) {
            Week everyweek = iter.next();
            System.out.println(everyweek.getYear() + "年第" + everyweek.getWeekNum() + "周\t" + "开始时间:" + everyweek.getWeekBegin() + "\t结束时间" + everyweek.getWeekEnd());
        }
        return WeekList;
    }

    public static void main(String[] args) {
        String start = "2015-12-12";
        String end = "2016-02-01";
        try {
            Date startDate = sdf.parse(start);
            Date endDate = sdf.parse(end);
            getWeekSplit(startDate, endDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class Week {

    String weekNum;
    int year;
    String weekBegin;
    String weekEnd;

    public String getWeekNum() {
        return weekNum;
    }

    public void setWeekNum(String weekNum) {
        this.weekNum = weekNum;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getWeekBegin() {
        return weekBegin;
    }

    public void setWeekBegin(String weekBegin) {
        this.weekBegin = weekBegin;
    }

    public String getWeekEnd() {
        return weekEnd;
    }

    public void setWeekEnd(String weekEnd) {
        this.weekEnd = weekEnd;
    }
}


执行结果如下:



""" 语音交互式DeepSeek问答系统 通过语音输入调用DeepSeek API回答问题 """ import json import os from vosk import Model, KaldiRecognizer import pyaudio import requests import mysql.connector from mysql.connector import Error from datetime import datetime from api.config import API_CONFIGS from doubaotts.doubaotts import VolcanoTTS # 初始化语音识别 model_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'model', 'vosk-model-cn-0.22', 'vosk-model-cn-0.22') model = Model(model_path) rec = KaldiRecognizer(model, 16000) p = pyaudio.PyAudio() # 本地ollama模型配置 ollama_model = "deepseek-r1:7b" # 初始化音频输入 def init_audio(): # 列出可用音频设备 for i in range(p.get_device_count()): print(p.get_device_info_by_index(i)) # 使用默认输入设备 stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8000, input_device_index=None) stream.start_stream() return stream # 调用本地ollama模型 def ask_deepseek(question): try: # 检查是否是数据库查询指令 if question.strip().lower().startswith("查询数据库:"): parts = question[len("查询数据库:"):].strip().split("|") if len(parts) == 2: db_name = parts[0].strip() query = parts[1].strip() result = query_other_db(db_name, query) if result is not None: return f"查询结果:\n{json.dumps(result, indent=2, ensure_ascii=False)}" else: return "查询失败,请检查数据库名称和查询语句" else: return "查询格式错误,请使用'查询数据库:数据库名|SQL查询语句'格式" # 普通问题处理 response = requests.post( "http://localhost:11434/api/generate", json={ "model": ollama_model, "prompt": question, "stream": False } ) if response.status_code == 200: return response.json()['response'].split('\n')[-1] # 只返回最后一行结果 else: return f"ollama模型错误: {response.status_code}" except Exception as e: return f"调用ollama模型时发生错误: {str(e)}" # 初始化MySQL连接 def init_db(): try: # 从配置中获取数据库连接参数 db_config = API_CONFIGS['mysql'] connection = mysql.connector.connect( host=db_config['host'], database=db_config['database'], user=db_config['user'], password=db_config['password'], port=db_config['port'], charset=db_config['charset'], connection_timeout=db_config['connection_timeout'] ) if connection.is_connected(): # 创建对话记录表 cursor = connection.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS conversations ( id INT AUTO_INCREMENT PRIMARY KEY, question TEXT NOT NULL, answer TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) connection.commit() return connection except Error as e: print(f"数据库连接错误: {e}") return None # 查询其他MySQL数据库 def query_other_db(database_name, query): try: # 从配置中获取基础连接参数 db_config = API_CONFIGS['mysql'] connection = mysql.connector.connect( host=db_config['host'], database=database_name, user=db_config['user'], password=db_config['password'], port=db_config['port'], charset=db_config['charset'], connection_timeout=db_config['connection_timeout'] ) if connection.is_connected(): cursor = connection.cursor(dictionary=True) cursor.execute(query) result = cursor.fetchall() connection.close() return result except Error as e: print(f"查询数据库{database_name}错误: {e}") return None # 保存对话到数据库 def save_conversation(connection, question, answer): try: cursor = connection.cursor() query = "INSERT INTO conversations (question, answer) VALUES (%s, %s)" cursor.execute(query, (question, answer)) connection.commit() except Error as e: print(f"保存对话失败: {e}") # 主程序 def main(): # 初始化数据库连接 db_connection = init_db() if not db_connection: print("警告: 无法连接到数据库,对话将不会被保存") stream = init_audio() print("请说出您的问题(按Ctrl+C退出)...") try: question = "" # 初始化question变量 while True: try: data = stream.read(4000, exception_on_overflow=False) if len(data) == 0: break if rec.AcceptWaveform(data): result = json.loads(rec.Result()) question = result['text'] if question.strip(): print(f"您的问题: {question}") answer = ask_deepseek(question) print(f"DeepSeek回答: {answer}") # 语音播报回答 from voice_management.voice_manager import VoiceManager voice_manager = VoiceManager() voice_manager.create_voice(answer) # 保存对话到数据库 if db_connection: save_conversation(db_connection, question, answer) question = "" # 重置question变量避免重复处理 else: partial = json.loads(rec.PartialResult()) if 'partial' in partial: print(f"正在识别: {partial['partial']}", end='\r') except OSError as e: if e.errno == -9981: # Input overflowed continue else: raise except KeyboardInterrupt: print("\n程序结束") finally: try: if stream.is_active(): stream.stop_stream() if not stream._closed: stream.close() except: pass p.terminate() # 关闭数据库连接 if db_connection and db_connection.is_connected(): db_connection.close() if __name__ == "__main__": main()能正常运行但是无法自动播放音频
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值