我正在编写一个程序,为每一小时的每一分钟生成一整天的时间戳。 我使用Calendar类来获取时间戳,我必须使用它,所以没有必要建议其他方法。
我制作文件的想法是让for循环24小时,嵌套for循环60分钟,其中时间戳将打印到.dat文件。我认为这会起作用,会打印一整天的数据然后停止。
但是我错了,完全错了!
结果是从现在起2年后每隔一分钟打印一次数据。
到目前为止,这是我的代码;
public static void main (String [] args) throws FileNotFoundException
{
try
{
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date date = new Date();
File fileName = new File(df.format(date) + ".dat");
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.add(Calendar.MILLISECOND, -cal.get(Calendar.MILLISECOND));
cal.add(Calendar.SECOND, -cal.get(Calendar.SECOND));
cal.add(Calendar.MINUTE, -cal.get(Calendar.MINUTE));
cal.add(Calendar.HOUR_OF_DAY, -cal.get(Calendar.HOUR_OF_DAY));
for(int hourInMinutes = 0; hourInMinutes < 1440; hourInMinutes++) //1440 is the total minutes in a day
{
for(int minute = 0; minute <= hourInMinutes; minute++)
{
raf.writeLong(cal.getTimeInMillis()); //Timestamp
cal.add(Calendar.MINUTE, 1);
}
}
raf.close();
}
catch(IOException iOE)
{
System.err.println(iOE);
}
}
数据从午夜(昨晚)开始,我希望它在同一天下午11点59分停止生成数据。
任何人都知道如何做到这一点?
答案 0 :(得分:5)
您的for
循环看起来不对,这是更新版本:
for(int hourInDay = 0; hourInDay < 24; hourInDay++)
{
for(int minute = 0; minute <= 59; minute++)
{
raf.writeLong(cal.getTimeInMillis());
cal.add(Calendar.MINUTE, 1);
}
}
或者你可以摆脱内部for
循环(第二个条件完全错误)并使用以下版本:
for(int minutesInDay = 0; minutesInDay < 1440; minutesInDay++) //1440 is the total minutes in a day
{
raf.writeLong(cal.getTimeInMillis());
cal.add(Calendar.MINUTE, 1);
}
并尝试为变量指定不同的名称。 hourInMinutes
对我来说就像“一分钟内的小时数”。显然,这不是这个变量所代表的含义。
答案 1 :(得分:2)
你应该抛弃你的内循环:
for(int hourInMinutes = 0; hourInMinutes < 1440; hourInMinutes++) //1440 is the total minutes in a day
{
raf.writeLong(cal.getTimeInMillis()); //Timestamp
cal.add(Calendar.MINUTE, 1);
}
答案 2 :(得分:0)
由于你已经在一天中每分钟循环,你不应该有一个内循环,就是这样。
答案 3 :(得分:0)
我更喜欢quartz-scheduler将是安排小时方便任务的最佳人选
答案 4 :(得分:0)
您正在使用旧的过时类,现在已被java.time类取代。
时区对于确定日期以及当天的小时数至关重要。对于任何特定时刻,日期在全球范围内因地区而异。指定ZoneId
对象。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime
使用该时区获取ZonedDateTime
对象中的当前时刻。
ZonedDateTime now = ZonedDateTime.now ( zoneId );
获取仅用于命名文件的日期值(LocalDate
)。
String filename = now.toLocalDate().toString();
为了获得当天的第一时刻,让java.time确定值。由于Daylight Saving Time (DST)或其他异常,不总是在某些时区的00:00:00
开始。为了获得第一时间,我们将简要介绍LocalDate
课程。
ZonedDateTime start = now.toLocalDate ().atStartOfDay ( zoneId );
在那里,我们每小时循环一次,直到第二天。其次循环每小时一小时,直到下一个小时。我们对循环进行软编码以测试超出限制,而不是硬编码数小时或数分钟。夏令时(DST)等异常可以将时钟移动数小时或分钟。例如,2007年为30-minute change in Venezuela。
ZonedDateTime nextDay = start.plusDays ( 1 );
ZonedDateTime zdt = start;
while ( zdt.isBefore ( nextDay ) ) {
ZonedDateTime zdtMinute = zdt;
ZonedDateTime zdtNextHour = zdtMinute.plusHours ( 1 );
while ( zdtMinute.isBefore ( zdtNextHour ) ) {
System.out.println ( zdtMinute.toString () );
// Prepare for next loop.
zdtMinute = zdtMinute.plusMinutes ( 1 );
}
// Prepare for next loop.
zdt = zdt.plusHours ( 1 );
}
跑步时。
2016-08-12T00:00-04:00 [美国/蒙特利尔]
2016-08-12T00:01-04:00 [美国/蒙特利尔]
2016-08-12T00:02-04:00 [美国/蒙特利尔]
2016-08-12T00:03-04:00 [美国/蒙特利尔]
...
2016-08-12T23:58-04:00 [美国/蒙特利尔]
2016-08-12T23:59-04:00 [美国/蒙特利尔]
Instant
如果您想要通用的24小时工作日和60分钟工作时间而不是ZonedDateTime
,请使用Instant
类,因为它始终位于UTC中。