Java - 24小时为每小时的每分钟生成一个时间戳

时间:2013-11-06 12:57:32

标签: java datetime calendar

我正在编写一个程序,为每一小时的每一分钟生成一整天的时间戳。 我使用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分停止生成数据。

任何人都知道如何做到这一点?

5 个答案:

答案 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

您正在使用旧的过时类,现在已被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中。