获取当天开始时间的日期
Posted
技术标签:
【中文标题】获取当天开始时间的日期【英文标题】:Getting Date with Start time of the Day 【发布时间】:2022-01-18 12:24:45 【问题描述】:我正在使用下面的函数来获取今天的日期:
fun getCurrentDateTime(dateFormat: String): String
val Datetime: String
val c = Calendar.getInstance()
val dateformat = SimpleDateFormat(dateFormat, Locale.getDefault())
Datetime = dateformat.format(c.time)
return Datetime
我有 today 过滤器来排序获取今天过滤的数据。但是,使用上述函数,我使用相同的值进行过滤, 表示今天的开始日期和今天的结束日期都相同。
我希望它与众不同。 方法 : 开始日期应为 1639560609(2021 年 12 月 15 日,星期三 00:00:00 GMT+05:30) 和 结束日期应该是当前时间(我用上面的函数得到的)
所以,你得到的问题是我想要今天的开始日期和当天的开始时间。
如何?谢谢。
【问题讨论】:
您有想要的String
格式吗?我的意思是模式,它不包含在您的问题中。为什么你使用这个过时的 api (java.util.Calendar
& java.text.SimpleDateFormat
) 而不是现代的: java.time
?
永远不要使用Calendar
、Date
和SimpleDateFormat
。这些类现在是遗留的,完全被现代的 java.time 类所取代。
【参考方案1】:
捕捉当前时刻。
Instant now = Instant.now() ;
请理解,对于任何特定时刻,日期会因时区而在全球各地发生变化。在某一时刻,它可能是日本东京的“明天”??,同时也可能是加拿大艾伯塔省埃德蒙顿的“昨天”??。
特定时区
获取特定时区中当时有效的日期。这里我们使用印度的时区??。
ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" ) ;
LocalDate todayKolkata = now.atZone( zKolkata ).toLocalDate() ;
获取该区域中日期的第一刻。
ZonedDateTime startOfTodayKolkata = todayKolkata.atStartOfDay( zKolkata ) ;
获取从 1970 年 UTC 第一刻到加尔各答该日期第一刻的整秒数。
long secondsSinceEpochToStartOfTodayKolkata = startOfTodayKolkata.toInstant().getEpochSecond() ;
如果您想跟踪一天的全长,请使用半开方法。在 Half-Open 中,开头是包容性的,而结尾是排他性的。因此,一整天从一个日期的第一刻开始,一直到(但不包括)下一个天的开始。
ZonedDateTime startOfTomorrowKolkata = todayKolkata.plusDays( 1 ).atStartOfDay( z ) ;
使用 ThreeTen-Extra 库中的 Interval
类以一对 Instant
对象的形式跟踪全天。
Interval allDayTodayKolkata = Interval.between( startOfTodayKolkata , startOfTomorrowKolkata ) ;
UTC(零偏移)
相比之下,确定今天日期的第一个时刻,偏移量为零时-分-秒。
LocalDate todayUtc = now.atOffset( ZoneOffset.UTC ).toLocalDate() ;
ZonedDateTime startOfDayUtc = todayUtc.atStartOfDay( ZoneOffset.UTC ) ;
long secondsSinceEpochToStartOfDayUtc = startOfDayUtc.toInstant().getEpochSecond() ;
【讨论】:
【参考方案2】:使用LocalDateTime
获取当前日期和当天开始
val dateFormatter = DateTimeFormatter.ofPattern("EEEE, d MMMM yyyy HH:mm:ss")
val localDate = LocalDate.now() // your current date time
val startOfDay: LocalDateTime = localDate.atStartOfDay() // date time at start of the date
val timestamp = startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() // start time to timestamp
Log.d("Date:", "start date $timestamp")
Log.d("Date:", "start date parsed $startOfDay.format(dateFormatter)")
输出: 开始日期时间戳:1639506600000 解析时间戳:2021 年 12 月 15 日星期三 00:00:00
编辑:获取日期结束时间
val endOfDate: LocalDateTime = localDate.atTime(LocalTime.MAX)
val timestampEnd = endOfDate.atZone(ZoneId.of("UTC")).toInstant().epochSecond
【讨论】:
我怎样才能得到 1639506600 而不是 1639506600000 ? 使用epochSecond
而不是.toEpochMilli()
我要求今天的结束时间。
是的,它将返回今天的结束时间,因为本地日期是当前日期LocalDate.now()
在尝试跟踪特定时刻时切勿使用LocalDateTime
类。该类缺少时区的上下文或与 UTC 的偏移量。因此该类不能代表时间线上的特定点。以上是关于获取当天开始时间的日期的主要内容,如果未能解决你的问题,请参考以下文章