gpt4 book ai didi

java - 在 Java 中生成两个日期之间的日开始时间和日结束时间。夏令时问题

转载 作者:行者123 更新时间:2023-11-30 03:24:18 25 4
gpt4 key购买 nike

我必须生成两个日期之间的天数。例如:

1420090495000 -> 2015 年 1 月 1 日

1430458495000 -> 2015 年 5 月 1 日

我必须生成所有日期的时间戳,例如

2015年1月1日00:00:00 - 2015年1月1日23:59:59

2015年1月2日00:00:00 - 2015年1月2日23:59:59

2015年1月3日00:00:00 - 2015年1月3日23:59:59

等等

我有能力做到这一点。但我在夏令时问题上遇到了一些问题。在行进的某个地方,它会像这样生成

2015年3月8日 00:00:00 - 2015年3月9日 00:01:00 这是错误的,应该像2015年3月8日 00:00:00 - 2015年3月8日23:59:59

我发现它是因为夏令时问题。如何解决这个问题?

我的代码是:

public static List<String> getDatesRange(long start, long end, String tzOffset) {
//tzOffset is 420. for USA

TimeZone tz = TimeZone.getTimeZone(tzOffset);

List<String> dates=new ArrayList();
Calendar calendar = Calendar.getInstance(tz);

calendar.set(Calendar.DAY_OF_WEEK, 1);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);


while (start<end) {
calendar.setTimeInMillis(start);
long startTime = calendar.getTimeInMillis();
int year= calendar.getWeekYear();


long endTime = start + (1 * 24 * 3600 * 1000L);

if(endTime<end) {
endTime-=1000;
System.out.println("Start Date= " + new Date(new Timestamp(start).getTime())+" ("+startTime+"), End Date= "+new Date(new Timestamp(endTime).getTime())+"("+endTime+")");

dates.add(startTime+"-"+endTime);
start= endTime+1000;
}
else{
System.out.println("Start Date= " + new Date(new Timestamp(start).getTime()) + " (" + startTime + "), End Date= " + new Date(new Timestamp(end).getTime()) + "(" + end + ")");
start=end;
dates.add(startTime+"-"+end);
}
}
return dates;
}

最佳答案

对此我有一些疑问:

  • 为什么使用长整型来定义日期?
  • 为什么返回字符串列表而不是日期列表?
  • 在这种情况下为什么要考虑时区?

尽管如此,您只需使用日历和 SimpleDateFormat 即可实现此目的,像这样:

public static Calendar getDayStart(final long timeInMillis) {
final Calendar cal = Calendar.getInstance();
// end time as a date
cal.setTimeInMillis(timeInMillis);

cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

return cal;
}

public static List<String> getDatesRange(final long start, final long end) {

final Calendar cal = getDayStart(start);
final Date startDate = cal.getTime();

final Calendar calEnd = getDayStart(end);
//adding one day because of the strict comparison in the while below
calEnd.add(Calendar.DAY_OF_YEAR, 1);
final Date endDate = calEnd.getTime();

final SimpleDateFormat formatter = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");

final List<String> dates = new ArrayList<String>();
final Date dayEnd;
String currentDay = "";

while(cal.getTime().before(endDate)) {
currentDay = formatter.format(cal.getTime());
currentDay += " - ";
//going to the end of the day
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.add(Calendar.SECOND, -1);
currentDay += formatter.format(cal.getTime());
//going to next day again and continue the loop
cal.add(Calendar.SECOND, 1);
//add what we computed to the list of days
dates.add(currentDay);
}

return dates;
}

关于java - 在 Java 中生成两个日期之间的日开始时间和日结束时间。夏令时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30635795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com