- 日期有关helper
获取日期时间段(JAVA)
/**
* 计算两个时间内所有日期
* @param date1
* @param date2
* @return
* @throws ParseException
*/
public static List<String> getDays(String date1, String date2) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Long startTime = sdf.parse(date1).getTime();
Long endTime = sdf.parse(date2).getTime();
List<String> dateList = new ArrayList<String>();
Long oneDay = 1000 * 60 * 60 * 24l;
Long time = startTime;
while (time <= endTime) {
Date d = new Date(time);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date=df.format(d);
System.out.println(date);
dateList.add(date);
time += oneDay;
}
return dateList;
}
/**
* 计算两个时间内 所有的周数 有点问题(不能按一周7天来计算)
* @param date1
* @param date2
* @return
* @throws ParseException
*/
public static List<String> getWeeks(String date1, String date2) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(date1);
Date parse2 = sdf.parse(date2);
List<String> dateList = new ArrayList<>();
Calendar c1=Calendar.getInstance();
c1.setTime(parse);
//转为周一
int weekYear = c1.get(Calendar.YEAR);
int weekOfYear = c1.get(Calendar.WEEK_OF_YEAR);
c1.setWeekDate(weekYear, weekOfYear, Calendar.MONDAY);
Calendar c2=Calendar.getInstance();
c2.setTime(parse2);
int weekYear2 = c2.get(Calendar.YEAR);
int weekOfYear2 = c2.get(Calendar.WEEK_OF_YEAR);
c2.setWeekDate(weekYear2, weekOfYear2, Calendar.SUNDAY);
while (true) {
int weekNum = c1.get(Calendar.WEEK_OF_YEAR);
System.out.println(sdf.format(c1.getTime())+" : "+weekNum);
dateList.add(c1.getWeekYear() + "-" + (weekNum > 9 ? weekNum : "0" + weekNum));
if (c1.getTimeInMillis() >= c2.getTimeInMillis()) {
break;
}
//增加7天,有问题哇
c1.setTimeInMillis(c1.getTimeInMillis()+1000*60*60*24*7);
}
return dateList;
}
/**
* 计算两个时间中所有的月份
* @param date1 开始时间
* @param date2 结束时间
* @return
* @throws ParseException
*/
public static List<String> getMonths(String date1, String date2) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(date1);
Date parse2 = sdf.parse(date2);
List<String> dateList = new ArrayList<>();
Calendar c1=Calendar.getInstance();
c1.setTime(parse);
//转为周一
int year = c1.get(Calendar.YEAR);
int month = c1.get(Calendar.MONTH);
c1.set(year, month, 1, 0, 0, 0);
Calendar c2=Calendar.getInstance();
c2.setTime(parse2);
int weekYear2 = c2.get(Calendar.YEAR);
int weekOfYear2 = c2.get(Calendar.WEEK_OF_YEAR);
c2.setWeekDate(weekYear2, weekOfYear2, Calendar.SUNDAY);
while (true) {
int tempMonth = c1.get(Calendar.MONTH);
String date = c1.getWeekYear() + "-" + ((tempMonth + 1) <= 9 ? "0" + (tempMonth + 1) : tempMonth + 1);
System.out.println(date);
dateList.add(date);
//下一个月<结束日期
c1.set(Calendar.MONTH, tempMonth +1);
if(c1.getTimeInMillis()>=c2.getTimeInMillis()){
break;
}
}
return dateList;
}
date_helper(C#)
public const string day_str = "天";
public const string week_str = "周";
public const string month_str = "月";
public const string season_str = "季";
public const string year_str = "年";
public const string period_str = "旬";
public const string period_str_format = "第{0}{1}";
public const string year_format = "yyyy";
public const string month_format = "yyyy-MM";
public const string date_short_format = "MM-dd";
public const string date_format = "yyyy-MM-dd";
public const string date_time_short_format = "MMdd HH:mm";
public const string date_time_format = "yyyy-MM-dd HH:mm:ss";
public const string period_format = "{0}年{1}月{2}";
public static DateTime convert_int_to_date_time(int time)
{
DateTime now = DateTime.Now;
DateTime startTime = DateTime.Parse(now.ToShortDateString());
return startTime.AddMinutes(time);
}
/// <summary>
/// int 时间值 转换成 时间字符串
/// </summary>
/// <param name="time"></param>
/// <param name="type">0,yyyy-MM-dd;1,yyyy-MM-dd HH:mm:ss</param>
/// <returns></returns>
public static string covert_int_to_date_time_string(int time, int type = 1)
{
string time_str = "";
DateTime now = DateTime.Now;
DateTime startTime = DateTime.Parse(now.ToShortDateString());
if (type == 1)
time_str = startTime.AddMinutes(time).ToString(date_time_format);
else
time_str = startTime.AddMinutes(time).ToString(date_format);
return time_str;
}
public static DateTime convert_day_int_to_date(int day)
{
DateTime now = DateTime.Now;
DateTime startTime = DateTime.Parse(now.ToShortDateString());
return startTime.AddDays(day);
}
/// <summary>
/// int 天 转换成时间字符串
/// </summary>
/// <param name="day"></param>
/// <param name="type"></param>
/// <returns></returns>
public static string convert_day_int_to_date_time_string(int day,int type =0)
{
string time_str = "";
DateTime now = DateTime.Now;
DateTime startTime = DateTime.Parse(now.ToShortDateString());
if (type == 1)
time_str = startTime.AddDays(day).ToString(date_time_format);
else
time_str = startTime.AddDays(day).ToString(date_format);
return time_str;
}
public static int convert_date_time_to_int(DateTime time)
{
DateTime now = DateTime.Now.Date;
return (int)(time - now).TotalMinutes;
}
public static int convert_date_to_int(DateTime time)
{
DateTime now = DateTime.Now;
DateTime startTime = DateTime.Parse(now.ToShortDateString());
return (int)(time - startTime).TotalDays;
}
/// <summary>
/// 日期(分钟) 转换为int
/// </summary>
/// <param name="time_str">日期</param>
/// <returns></returns>
public static int convert_date_time_to_int(string time_str)
{
return convert_date_time_to_int(DateTime.Parse(time_str));
}
/// <summary>
/// 日期(天)转换为int
/// </summary>
/// <param name="time_str"></param>
/// <returns></returns>
public static int convert_date_to_int(string time_str)
{
return convert_date_to_int(DateTime.Parse(time_str));
}
/// <summary>
/// 获取日期索引的对应中文名称
/// </summary>
/// <param name="period_type"></param>
/// <param name="day_index"></param>
/// <returns>
/// 天: 返回MM-dd;
/// 月: 返回yyyy-MM;
/// 季度:返回第几季度;
/// 年:返回yyyy;
/// </returns>
public static string get_period_name(period_type period_type, int day_index)
{
string period_name = "";
int idx;
DateTime date = convert_day_int_to_date(day_index);
switch (period_type)
{
case period_type.day:
period_name = date.ToString(date_short_format);
break;
case period_type.week:
idx = get_week_of_year(date);
period_name = string.Format(period_str_format, idx, week_str);
break;
case period_type.month:
period_name = date.ToString(month_format);
break;
case period_type.season:
idx = (date.Month + 2) / 3;
period_name = string.Format(period_str_format, idx, season_str);
break;
case period_type.year:
period_name = date.ToString(year_format);
break;
case period_type.period:
idx = get_period_date_name(date);
period_name = String.Format(period_format, date.Year, date.Month, (day_of_period)idx);
break;
}
return period_name;
}
private static int get_period_date_name(DateTime date)
{
int day = date.Day;
if (day < 11)
{
return 0;
}
else if (day < 21)
{
return 1;
}
return 2;
}
public static object get_current_segment(period_type period_type, int day_index)
{
DateTime date = convert_day_int_to_date(day_index);
if (period_type == period_type.day)
{
return date.ToString("MM-dd");
}
else if (period_type == period_type.week)
{
return get_week_of_year(date);
}
else if (period_type == period_type.month)
{
return date.Month;
}
else if (period_type == period_type.season)
{
return (date.Month + 2) / 3;
}
else if (period_type == period_type.period)
{
int idx = get_period_date_name(date);
return (day_of_period)idx;
}
return day_index;
}
/// <summary>
/// 获取下个周期的开始时间
/// </summary>
/// <param name="type">周期类型</param>
/// <param name="start">上一个周期的start</param>
/// <param name="week_type">0:年末周期跨年时不切割,1:年末周期跨年时切割为两个周期</param>
/// <returns></returns>
public static int find_next_period_start(period_type type, int start, bool is_year_seperate)
{
switch (type)
{
case period_type.day:
return ++start;
case period_type.week:
return find_next_week_start(start, is_year_seperate);
case period_type.month:
return find_next_month_start(start);
case period_type.season:
return find_next_season_start(start);
case period_type.period:
return find_next_period_start(start);
default:
return 0;
}
}
public static int get_week_of_year(DateTime date)
{
CultureInfo info = new CultureInfo(helper_strs.culture_info);
Calendar calendar = info.Calendar;
CalendarWeekRule week_rule = info.DateTimeFormat.CalendarWeekRule;
int week = calendar.GetWeekOfYear(date, week_rule, DayOfWeek.Monday);
return week;
}
/// <summary>
/// 获取自然周的下周开始时间
/// </summary>
/// <param name="day"></param>
/// <param name="type">0:年末周期跨年时不切割,1:年末周期跨年时切割为两个周期</param>
/// <returns></returns>
private static int find_next_week_start(int day, bool is_year_seperate)
{
DateTime target_day = DateTime.Today.AddDays(day);
//当周还剩余的天数
int residue = 7 - (target_day.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)target_day.DayOfWeek);
int next_start = day + residue + 1;
DateTime next_start_date = DateTime.Today.AddDays(next_start);
if (target_day.Year != next_start_date.Year && is_year_seperate)
{
DateTime next_year_first_day_date = DateTime.Parse(next_start_date.Year + "-01-01");
int next_year_first_day = (int)(next_year_first_day_date - DateTime.Today).TotalDays;
if (next_start > next_year_first_day)
{
return next_year_first_day;
}
}
return next_start;
}
private static int find_next_month_start(int day)
{
DateTime target_day = DateTime.Today.AddDays(day);
DateTime dayone = new DateTime(target_day.AddMonths(1).Year, target_day.AddMonths(1).Month, 1);
return (int)(dayone - DateTime.Today).TotalDays;
}
private static int find_next_season_start(int day)
{
int next_month_start = find_next_month_start(day);
DateTime target_day = DateTime.Today.AddDays(next_month_start);
int diff_month = (3 - (target_day.Month + 2) % 3) % 3;
target_day = target_day.AddMonths(diff_month);
return (int)(target_day - DateTime.Today).TotalDays;
}
private static int find_next_period_start(int day) {
DateTime target_day = DateTime.Today.AddDays(day);
int _day = target_day.Day;
int next_start = 0;
if (_day < 11)//上旬
{
next_start = day + 10 - _day + 1;
}
else if (10 < _day && _day < 21)//中旬
{
next_start = day + 20 - _day + 1;
}
else { //下旬
DateTime last_date = target_day.AddDays(1 - target_day.Day).AddMonths(1).AddDays(-1);
next_start = day + last_date.Day - _day + 1;
}
return next_start;
}
public static int get_day_count_between_dates(string earlier_date, string later_date)
{
DateTime early = DateTime.Parse(earlier_date);
DateTime later = DateTime.Parse(later_date);
return (later - early).Days;
}
public static void write_object_to_csv<T>(jnn_list<T> objs, string directory_name)
{
if (objs.size() > 0)
{
StringBuilder content = new StringBuilder();
Type ty = objs.get(0).GetType();
string file_name = ty.Name;
FieldInfo[] fileds = ty.GetFields();
for (int i = 0; i < fileds.Length; i++)
{
content.Append(fileds[i].Name);
content.Append(",");
}
content.Remove(content.Length - 1, 1);
content.Append("\n");
for (int i = 0; i < objs.size(); i++)
{
object obj = objs.get(i);
for (int j = 0; j < fileds.Length; j++)
{
content.Append(fileds[j].GetValue(obj));
content.Append(",");
}
content.Remove(content.Length - 1, 1);
content.Append("\n");
}
string directory_path = AppDomain.CurrentDomain.BaseDirectory + directory_name + "/";
if (!Directory.Exists(directory_path))
{
Directory.CreateDirectory(directory_path);
}
using (StreamWriter writer = new StreamWriter(directory_path + file_name + ".csv", false, Encoding.UTF8))
{
writer.WriteLine(content);
}
}
}
public static int calculate_shift_time(string shift)
{
string[] shift_strings = shift.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
int total_shift_time = 0;
for (int i = 0; i < shift_strings.Length; i++)
{
string shift_string = shift_strings[i];
string[] shift_times = shift_string.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
int start = calculate_minutes_by_time_string(shift_times[0]);
int end = calculate_minutes_by_time_string(shift_times[1]);
if (end <= start)
{
end += limits.day_length;
}
total_shift_time += end - start;
}
return total_shift_time;
}
public static int calculate_minutes_by_time_string(string time_string)
{
string[] values = time_string.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
int res = Convert.ToInt32(values[0]) * 60 + Convert.ToInt32(values[1]);
return res;
}
}
判断时间格式是否正确
/**
* 是否是正确的时间格式
*
* @param date a string of date
* @param format_str a format of date
* @return if date is in the form of the format
* @author Liu Kunyuan
*/
public static boolean is_correct_time_format(String date, String format_str, boolean is_exact) {
if (string_helper.is_null_or_blank(date) || string_helper.is_null_or_blank(format_str)) {
return false;
}
DateFormat df = new SimpleDateFormat(format_str);
boolean res = true;
try {
df.parse(date);
if (is_exact) {
if (!date.equals(df.format(df.parse(date)))) {
return false;
}
}
} catch (Exception e) {
res = false;
}
return res;
}