获取当天开始时间的日期

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 永远不要使用CalendarDateSimpleDateFormat。这些类现在是遗留的,完全被现代的 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 的偏移量。因此该类不能代表时间线上的特定点。

以上是关于获取当天开始时间的日期的主要内容,如果未能解决你的问题,请参考以下文章

javascript获取当天本周本月本年 开始及结束时间

如何在 [NSDate 日期] 当天 00:00 获取 NSDate?

JS里面怎么获取当天日期

sql中如何获取当天时间的零点

实体框架获取当前日期行(当天的时间)

转:python时间日期处理小结