日历实例和日期实例代码如下:val calendar = Calendar.getInstance() 和 val date = Date(),返回的时间不正确。

4
我编写了两个函数来获取“开始时间”和“结束时间”。结束时间始终为当前时间,而开始时间始终为当前时间减去2秒。
以下是函数代码。
private fun getStartDateTime(): String {
    val dateFormat = SimpleDateFormat(Constants.SERVER_DATE_FORMAT, Locale.getDefault())
    val calendar = Calendar.getInstance() 
    calendar.add(Calendar.SECOND, -2)
    return dateFormat.format(calendar.time)
}

private fun getEndDateTime(): String {
    val dateFormat = SimpleDateFormat(Constants.SERVER_DATE_FORMAT, Locale.getDefault())
    val date = Date()
    return dateFormat.format(date)
}

在大多数设备上,它的工作方式都符合预期,但是当我在Oneplus 6上测试时,它开始给出调用此函数时相同的时间。请查看下面本地数据库表的截图。 enter image description here 问题: 这些函数每2秒钟调用一次,因此起始时间和结束时间应该是唯一的。是否有任何原因导致我没有得到唯一的“开始时间”和“结束时间”?
编辑:
这些函数在创建一个新的call对象时被调用。
val abc = ABC(xxx, xxx, xxx, getStartDateTime(), getEndDateTime())

1
调用这两个方法之间是否存在计算延迟?请添加您调用这些方法的代码。Java 7日期已经失效,您应该使用JSR310..ThreeTenBmp..。 - ADM
你是否排除了代码其他地方出现错误的可能性? - Ken Y-N
是的,这是 Kotlin 代码。 - Sanjay Kakadiya
1
在你的方法中插入一个调试日志语句,以查看它们实际被调用的频率和时间。 - chrylis -cautiouslyoptimistic-
1
很不幸,在这么多年之后你仍然需要使用JAVA 7。无论如何,如果你的业务逻辑总是在开始时间和结束时间之间计算出2秒的延迟,那么为什么不重用你的开始时间对象来快进2秒以获取结束时间呢?是否有必要使用两个不同的日期时间对象? - Jeel Vankhede
显示剩余5条评论
2个回答

1
这只是猜测。一些可能的解释包括:
  • (不太可能)设备上的时钟已停止。
  • (不太可能)该设备上的Calendar.getInstance()Date()实现缓存过多,给出了来自陈旧缓存的值。
  • 调度程序在该设备上无法工作,并且比每2秒一次更频繁地调用您的函数。最可能的变体是,多个调度程序正在运行,每个调用都是每2秒一次。
  • 由于某种错误,您的对象被插入到数据库中多次,并具有不同的ID。

我们没有任何信息可以让我们更接近答案。正如chrylis -cautiouslyoptimistic-在评论中所说的那样,您可以从函数中进行一些日志记录,以查看它在程序运行期间实际被调用的次数。此外,1332个条目与预期数量相比如何?

顺便说一句,如果可以,请使用java.time,即现代Java日期和时间API,如另一个答案的后半部分所解释的那样。如果问题确实是陈旧缓存,则也很有可能避免出现该问题。


1

你的方法存在缺陷。

由于你的开始日期时间和结束日期时间是相互依存的,所以你应该从其中一个推导出另一个。你的方法问题在于你从计算时间中推导出了开始日期时间和结束日期时间,即你有两个变量数量(开始日期时间的计算时间和结束日期时间的计算时间)而不是一个。

以下是Java代码,希望你能将其转换为Kotlin:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        // Test
        System.out.println(getStartDateTime());
        System.out.println(getEndDateTime());
    }

    /**
     * 
     * Derives start date-time from end date-time
     * 
     * @throws ParseException
     */
    private static String getStartDateTime() throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = dateFormat.parse(getEndDateTime());// Get end date-time
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.SECOND, -2);
        return dateFormat.format(calendar.getTime());
    }

    private static String getEndDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = new Date();
        return dateFormat.format(date);
    }
}

一个示例运行的输出:

2020-09-28 11:26:58
2020-09-28 11:27:00

一条建议:

我建议您从过时且容易出错的java.util日期时间API和SimpleDateFormat切换到现代化的java.time日期时间API和相应的格式化API(包,java.time.format)。了解有关现代日期时间API的更多信息,请参阅Trail: Date Time。如果您的Android API级别仍不符合Java-8,请检查通过desugaring可用的Java 8+ APIs如何在Android项目中使用ThreeTenABP

使用现代日期时间API:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getStartDateTime());
        System.out.println(getEndDateTime());
    }

    /**
     * 
     * Derives start date-time from end date-time
     * 
     */
    private static String getStartDateTime() {
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.getDefault());
        LocalDateTime ldt = LocalDateTime.parse(getEndDateTime(), dateFormat);// Get end date-time
        return dateFormat.format(ldt.minusSeconds(2));
    }

    private static String getEndDateTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.getDefault()));
    }
}

3
投反对票的人 - 请留下评论,以便我可以帮助您。答案明确而精确。如果您对答案的任何部分不清楚,我将通过评论来帮助您或在需要时更新答案。 - Arvind Kumar Avinash
3
不明白为什么这个答案被认为是“无用的”…… - deHaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接