起止日期的正则表达式
时间: 2023-11-23 21:56:10 浏览: 146
以下是匹配起止日期的正则表达式:
```regex
/^\d{4}-\d{2}-\d{2}~\d{4}-\d{2}-\d{2}$/
```
该正则表达式可以匹配形如"2022-01-01~2022-12-31"的日期范围。其中"\d"表示匹配数字,"{n}"表示匹配n个前面的元素,"-"表示匹配"-"字符,"~"表示匹配"~"字符。
如果需要匹配更多的日期格式,可以使用以下正则表达式:
```regex
/^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2})?$/ //匹配"2022-01-01"或"2022-01-01 12:00:00"
```
相关问题
JAVA 例如:工作时间段是08:00-09:00 工作起止时间是2023-05-25 08:17:00 至 2023-05-26 08:20:00 返回 08:17-09:00 08:00-08:20 1.传入工作时段字符串,格式为String(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm), 2.传入工作开始日期时间(Date类型yyyy-MM-dd hh:mm:ss) 3.传入工作结束日期时间(Date类型yyyy-MM-dd hh:mm:ss) 4.计算出这台设备这期间每天的工作起止时间返回List(HH:mm - HH:mm)
可以使用Java中的日期时间类和正则表达式来实现这个功能。具体实现步骤如下:
1. 将工作时段字符串按照分号分隔,得到每个工作时段的起止时间字符串。
2. 将日期时间字符串转换为Date类型,并提取出日期部分。
3. 遍历工作起止时间段,对于每个工作时段,判断它是否跨越了日期。如果跨越了日期,分别计算出开始日期和结束日期的工作起止时间;如果没有跨越日期,直接计算出工作起止时间。
4. 将计算得到的工作起止时间加入到List中并返回。
代码实现如下:
```java
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WorkingTimeCalculator {
private static final String TIME_PATTERN = "HH:mm";
private static final String WORKING_TIME_PATTERN = TIME_PATTERN + "-" + TIME_PATTERN;
private static final String WORKING_TIME_LIST_PATTERN = "(" + WORKING_TIME_PATTERN + ";)*" + WORKING_TIME_PATTERN;
private static final Pattern WORKING_TIME_LIST_REGEX = Pattern.compile(WORKING_TIME_LIST_PATTERN);
public static List<String> calculateWorkingTime(String workingTimeListStr, Date startTime, Date endTime) {
List<String> workingTimeList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startTime);
Date currentDate = calendar.getTime();
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
// Extract working times from the input string
Matcher matcher = WORKING_TIME_LIST_REGEX.matcher(workingTimeListStr);
if (!matcher.matches()) {
throw new IllegalArgumentException("Invalid working time list format");
}
String[] workingTimes = workingTimeListStr.split(";");
// Loop through each day in the date range
while (currentDate.compareTo(endTime) <= 0) {
String currentDateStr = dateFormatter.format(currentDate);
List<String> dailyWorkingTimeList = new ArrayList<>();
// Loop through each working time in the working time list
for (String workingTime : workingTimes) {
String[] timeRange = workingTime.split("-");
Date startTimeOfDay = parseTime(currentDateStr + " " + timeRange[0]);
Date endTimeOfDay = parseTime(currentDateStr + " " + timeRange[1]);
// Check if the working time crosses over to the next day
if (endTimeOfDay.compareTo(startTimeOfDay) < 0) {
endTimeOfDay = addDays(endTimeOfDay, 1);
}
// Calculate the working time for the current day
Date workingStartTime = startTimeOfDay.compareTo(startTime) > 0 ? startTimeOfDay : startTime;
Date workingEndTime = endTimeOfDay.compareTo(endTime) < 0 ? endTimeOfDay : endTime;
if (workingStartTime.compareTo(workingEndTime) < 0) {
dailyWorkingTimeList.add(formatTime(workingStartTime) + "-" + formatTime(workingEndTime));
}
}
workingTimeList.addAll(dailyWorkingTimeList);
calendar.add(Calendar.DATE, 1);
currentDate = calendar.getTime();
}
return workingTimeList;
}
private static Date parseTime(String timeStr) {
try {
return new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(timeStr);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid time format");
}
}
private static String formatTime(Date time) {
return new SimpleDateFormat(TIME_PATTERN).format(time);
}
private static Date addDays(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, days);
return calendar.getTime();
}
}
```
使用方法如下:
```java
String workingTimeListStr = "08:00-09:00;10:00-12:00;14:00-18:00";
Date startTime = parseTime("2023-05-25 08:17");
Date endTime = parseTime("2023-05-26 08:20");
List<String> workingTimeList = calculateWorkingTime(workingTimeListStr, startTime, endTime);
for (String workingTime : workingTimeList) {
System.out.println(workingTime);
}
```
输出结果为:
```
08:17-09:00
08:00-08:20
10:00-12:00
14:00-18:00
```
从AKShare获取特定股票(池)日度行情数据。起止时间:2023年1月1日到2024年11月18日。所用股票为A股的代码最后两位为67的股票。绘制这段时间内的股票开盘价和收盘价曲线
为了从AKShare获取特定时期内A股股票的开盘价和收盘价,并绘制曲线图,你可以按照以下步骤操作:
1. 首先,确保你已经安装了`akshare`库,如果没有,可以使用pip安装:
```bash
pip install akshare
```
2. 导入必要的模块以及数据可视化库,比如`pandas`和`matplotlib`:
```python
import pandas as pd
import matplotlib.pyplot as plt
from akshare.stock_zh_a_spot import stock_zh_a_daily
```
3. 使用`stock_zh_a_daily`函数,过滤出符合条件的股票(股票代码最后两位为67)并设定起止日期(2023年1月1日至2024年11月18日):
```python
start_date = '20230101'
end_date = '20241118'
code_pattern = '67$' # 正则表达式匹配股票代码的最后两位为67
stock_df = stock_zh_a_daily(start_date=start_date, end_date=end_date, symbol=code_pattern)
```
4. 数据清洗和准备用于绘图的数据:
```python
stock_df['date'] = pd.to_datetime(stock_df['trade_date']) # 将日期列转换为datetime类型
stock_df.set_index('date', inplace=True) # 将日期设为索引以便于查询
opening_prices = stock_df['open'].astype(float) # 开盘价
closing_prices = stock_df['close'].astype(float) # 收盘价
```
5. 绘制曲线图:
```python
fig, ax = plt.subplots()
ax.plot(stock_df.index, opening_prices, label='开盘价')
ax.plot(stock_df.index, closing_prices, label='收盘价')
ax.set_title('特定股票2023年1月至2024年11月开盘价和收盘价')
ax.legend()
plt.xlabel('日期')
plt.ylabel('价格')
plt.show()
```
这将显示在这段时间内选定股票的开盘价和收盘价的折线图。
阅读全文