如何将开始时间和结束时间设为凌晨12点到12点?

时间:2018-11-08 13:37:11

标签: java android calendar

我希望我的计步器显示上午12点至凌晨12点的步骤,但我找不到解决方法。我正在使用 Google的健身API

代码如下:

        Calendar cal = Calendar.getInstance();
        Date today = new Date();
        cal.setTime(today);
        long endTime = cal.getTimeInMillis();
        cal.add(Calendar.MONTH, -1);
        long startTime = cal.getTimeInMillis();

        java.text.DateFormat dateFormat = DateFormat.getDateInstance();
        Log.e("History", "Range Start: " + dateFormat.format(startTime));
        Log.e("History", "Range End: " + dateFormat.format(endTime));

//Check how many steps were walked and recorded in the last 7 days
        final DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                .bucketByTime(1, TimeUnit.DAYS)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();

        final DataReadResult dataReadResult = Fitness.HistoryApi.readData(mGoogleApiClient, readRequest).await(1,TimeUnit.MINUTES);

3 个答案:

答案 0 :(得分:2)

java.time

您使用的是可怕的旧日期时间类,而这些类早已被JSR 310中定义的 java.time 类所取代。

LocalDate

首先,获取感兴趣的日期。如果要“今天”,则必须指定一个时区。

LocalDate类表示没有日期,没有time zoneoffset-from-UTC的仅日期值。

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将desired/expected time zone明确指定为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果要使用JVM的当前默认时区,请提出要求并作为参数传递。如果省略,则会隐式应用JVM的当前默认值。最好明确一点,因为默认值可能会在运行时的任何时候被JVM中任何应用程序的任何线程中的任何代码更改。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

一天中的第一时刻

  

12点至12点

一天并非总是从凌晨12点到凌晨12点!

永远不要假设一天的开始或结束。一天并非总是24小时长,它可以是23、23.5、25或定义时区的政客所梦想的任何其他小时数。在某些日期的某些区域中,日期可能不是从00:00开始,而是从其他时间(例如01:00)开始。让 java.time 确定一天的开始和结束时间。

半开

通常,定义时间跨度的最佳方法是半开放式方法。在这种方法中,开始为包含,而结束为排他。这避免了尝试确定一天中确切的秒结束时间的挑战。一天从一个日期的第一时刻开始,一直到(但不包括)下一日期的第一时刻。

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;  // First moment of the day as seen in the wall-clock time used by the people of a particular region as defined arbitrarily by their politicians (a time zone).
ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( 1 ) ;  // First moment of the day of the *following* date.

时间表参考日期和粒度

DataReadRequest.Builder::setTimeRange以来,epoch reference date的Google API占用了一定的粒度。不幸的是,没有指定粒度限制或没有指定纪元引用–并且正在使用many epoch references

我将以几秒钟为最佳粒度进行猜测,并以1970-01-01T00:00Z为时代参考。这个时期被 java.time 类和可怕的旧java.util.Date类使用。

long secondsSinceEpoch_Start = zdtStart.toEpochSecond() ;
long secondsSinceEpoch_Stop = zdtStop.toEpochSecond() ;

调用API。

            …
            .setTimeRange( 
                secondsSinceEpoch_Start , 
                secondsSinceEpoch_Stop , 
                TimeUnit.SECONDS
            )
            …

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

答案 1 :(得分:0)

you can try like this

            Date date1 = new Date();
            SimpleDateFormat  formatter1 = new SimpleDateFormat("MMddyyyy"); 
            String format = formatter1.format(date1);
            SimpleDateFormat  formatter = new SimpleDateFormat("MMddyyyy hh:mm:ss"); 
            Calendar cal = Calendar.getInstance();
            Date today = formatter.parse(format+" 00:00:00");
            cal.setTime(today);
            long start = cal.getTimeInMillis();
            System.out.println("start time:"+start);
            Date date=formatter.parse(format+" 23:59:59");
            cal.setTime(date);
            long end = cal.getTimeInMillis();
            System.out.println("end time: "+end);

            Date tem= new Date();

            cal.setTime(tem);

            long present = cal.getTimeInMillis();

            System.out.println(present);

答案 2 :(得分:0)

如果需要一天的开始,则应将其设置为:

Calendar cal = new GregorianCalendar();
cal.clear(Calendar.HOUR); cal.clear(Calendar.AM_PM);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
// after all this we'd have the start of day.
// works good if extracted to separate method, which is the unfortunate truth of working with  old calendar classes

// minus one milli because Fit API treats includes end of range
long end = cal.getTimeInMillis() - 1;

cal.add(Calendar.MONTH, -1);
long start = cal.getTimeInMillis();

我也建议为此导入和使用Joda库(最好使用Android特定版本)。 使用Joda(只要在Fit上有可用的Java 8,就可以使用java.time程序包,只需稍作更改即可),您可以编写类似的代码,如下所示:

DateTime date = LocalDate.now().toDateTimeAtStartOfDay();

long end = date.getMillis() - 1;

long start = date.minusMonths(1).getMillis();