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


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函数并传递字符串的格式仍然是不正确的,我错过了什么??

java。脱糖时间

考虑使用java。time,现代Java日期和时间API,用于您的日期工作。

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

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

目前输出:

新年第一天:20121-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);

格式化日期:20121-01-01 00:00:00

你的代码出了什么问题?

这一行有一个错误:

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

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

last tuesday 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。这对印度来说是不正确的。你需要将其设置为亚洲/加尔各答。对于时区,始终使用region/city格式。虽然两者对今年的日期给出了相同的结果,但历史日期存在差异,如果印度政客决定在某个时候再次改变印度的时区偏移,未来的日期可能会再次出现差异。世界其他地区的经验表明,这种情况经常发生。

问题:不java。何时需要Android API级别26?

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

  • 在较新的Android设备(从API级别26开始),现代API是内置的。
  • 在旧的Android上使用desugaring。请看下面的链接。

链接
  • Oracle教程:日期时间说明如何使用java.time.
  • Java 8+ api

您没有在日志中获得所需输出格式的原因是您正在尝试打印"date"对象,但不格式化。

当你尝试像在输出中那样直接打印对象时,它将由该类或其父类提供的toString()方法表示。这就是为什么当您输入

时没有得到您想要的输出:
Log.i("mpurusharth","last $it")

试试这个:

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

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

最新更新