简单日期时间给出了错误的日期格式

Simple Date time gives the wrong format of date

class TimeStampFormat {

    private val recordDtmFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.ENGLISH)
   // private val recordDtmFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale("en","IN"))
    fun getTimeStamp(): Date{
        return recordDtmFormat.parse(Calendar.getInstance().time.toString())!!
    }
    fun parseDate(date:Date):Date {
        return recordDtmFormat.parse(recordDtmFormat.format(date))!!.also {
           Log.i("mpurusharth","last $it")
        }
    }
    fun formatDate(time : String):Date{
        return recordDtmFormat.parse(time)!!.also {
            Log.i("mpurusharth","last $it")
        }
    }

我的默认日期应该是我得到的一年的第一天

   val calendar = Calendar.getInstance()
        calendar.set(Calendar.YEAR,0,1)
        val date = calendar.time

当我将日期传递给函数时,它给出了错误的日期格式

lastSyncDttm = TimeStampFormat().parseDate(date)

给予

last Tue Jan 01 13:09:48 GMT+05:30 1

为什么日期格式不正确。 即使我使用 formatDate 函数并传递一个字符串,格式仍然不正确我错过了什么??

您没有在日志中获得所需输出格式的原因是您试图直接打印“日期”对象而不对其进行格式化。

每当您尝试在输出中直接打印对象时,它将由 class 或它的 super 提供的 toString() 方法表示。这就是你在输入时没有得到你想要的输出的原因:

Log.i("mpurusharth","last $it")

试试这个:

Log.i("mpurusharth","last ${recordDtmFormat.format(it)}")

在这里,使用来自 recordDtmFormat 的 format() 将生成您想要的输出。

java.time 通过脱糖

考虑使用 java.time,现代 Java 日期和时间 API,作为你的约会工作。

获取当年的第一天 - 请原谅我的 Java 语法:

    LocalDate firstDayOfThisYear
            = LocalDate.now(ZoneId.systemDefault()).withDayOfYear(1);
    System.out.println("First day of the year: " + firstDayOfThisYear);

到目前为止的输出:

First day of the year: 2021-01-01

要格式化成你想要的格式:

    String formattedDate = firstDayOfThisYear.atStartOfDay()
            .format(RECORD_DTM_FORMAT);
    System.out.println("Formatted date: " + formattedDate);

我使用了这个静态格式化程序:

private static final DateTimeFormatter RECORD_DTM_FORMAT
        = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);

Formatted date: 2021-01-01 00:00:00

你的代码出了什么问题?

这一行有一个错误:

    calendar.set(Calendar.YEAR,0,1)

您找到的不是今年的第一天,而是公元 1 年(2020 年前)的第一天。您错误地使用了常量 Calendar.YEAR。它是一个常量,用于访问 Calendar 对象的年份字段,值为 1。因此您指定的年份是 1。这是 Calendar 的一个常见错误。在您的输出中,您可以看到您得到了第 1 年(末尾的数字 1):

last Tue Jan 01 13:09:48 GMT+05:30 1

您还注意到对 set() 的调用并没有去掉一天中的时间,这可能是您想要的。

这个方法调用实际上什么都不做(或者真的很少):

    recordDtmFormat.parse(recordDtmFormat.format(date))

您正在将 Date 对象格式化为 String 只是为了再次将其解析回 Date 对象。您得到的是一个 Date 对象,等于您拥有的对象。只有第二个毫秒被丢弃,因为它们不是您的字符串格式。这是唯一的区别。

一些不会导致意外输出的详细信息,但您可能仍然想知道:您已注释掉这一行:

// private val recordDtmFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale("en","IN"))

T 硬编码为格式模式字符串中的文字是正确的,因为那里应该始终有一个 T 并且它不包含任何语义。 Z 带有语义:它与 UTC 的偏移量为 0。因此,您绝不能将其硬编码为格式模式字符串中的文字。您需要将其解析为偏移量,否则会得到不正确的结果。

同样在您的输出中,您似乎已将默认时区设置为 GMT+05:30。这对印度来说是不正确的。您需要将其设置为 Asia/Kolkata。始终对时区使用 region/city 格式。虽然两者都给出了今年日期的相同结果,但历史日期存在差异,如果印度政客决定再次更改印度的时区偏移,未来日期可能会再次出现差异。世界其他地区的经验表明,这种情况经常发生。

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在较新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在较旧的 Android 上使用脱糖。请参阅下面的 link。

链接