英文:
How to get Thisweek start and end date and Lastweek start and end date in Kotlin
问题
我需要获取本周的开始日期,如2023-02-20,以及上周的开始日期和结束日期。
开始日期将是星期一。
所以我创建了4个变量,如下所示:
private var thisWeekStart: Long = 0
private var thisWeekEnd: Long = 0
private var lastWeekStart: Long = 0
private var lastWeekEnd: Long = 0
我尝试像下面这样赋值:
var cal = Calendar.getInstance()
cal.time = Date()
thisWeekEnd = cal.timeInMillis
// 本周开始
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
thisWeekStart = cal.timeInMillis
cal.add(Calendar.DAY_OF_WEEK, -7)
lastWeekStart = cal.timeInMillis
cal.add(Calendar.DAY_OF_WEEK, 6)
lastWeekEnd = cal.timeInMillis
但它返回的是毫秒,而不是yyyy-MM-dd格式。而且我不确定清除日历的方法是否正确。最重要的是,我无法通过上述方法获取上周的结束日期。
有没有更好的方法来获取本周和上周的开始和结束日期?
英文:
I need to get this week startdate like 2023-02-20 and last week startdate and end date.
startdate will be monday.
so I create 4 variables like below.
private var thisWeekStart : Long = 0
private var thisWeekEnd : Long = 0
private var lastWeekStart : Long = 0
private var lastWeekEnd : Long = 0
And I tried to assign something like below..
var cal = Calendar.getInstance()
cal.time = Date()
thisWeekEnd = cal.timeInMillis
// 이번주 시작
cal.get(Calendar.DAY_OF_WEEK)
thisWeekStart = cal.timeInMillis
cal.add(Calendar.DAY_OF_WEEK, -1)
lastWeekStart = cal.timeInMillis
cal.clear()
cal.set(Calendar.DAY_OF_WEEK, -1)
lastWeekStart = cal.timeInMillis
But it throws milliseconds not like yyyy-MM-dd format.
And I'm not sure is that correct way of keep clearing calendar like above.
Most of all, I can't get last week's end date with above way.
Is there any good way to get this weed and last week start, end date?
答案1
得分: 1
// tl;dr
使用 *java.time*。
(使用Java语法而不是Kotlin。)
英文:
tl;dr
Use java.time.
(In Java syntax rather than Kotlin.)
LocalDate // Represent a date-only value.
.now( ZoneId.of( "Asia/Seoul" ) ) // Get the current date as seen in a particular time zone.
.with(
TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY )
) // Returns another LocalDate.
.atStartOfDay( ZoneId.of( "Asia/Seoul" ) ) // Determine the first moment of the day on that date in that time zone.
.toInstant() // Convert to UTC. Same moment, same point on the timeline.
.toEpochMilli() // Extract a count of milliseconds since 1970-01-01T00:00Z.
Avoid legacy classes
The legacy date-time classes are terrible, deeply flawed in their design. They were supplanted years ago by the modern java.time classes built into Java 8 and later.
An implementation is built into Android 26+. For earlier Android, the latest tooling makes most of the java.time functionality available via API desugaring.
java.time
LocalDate
> need to get this week startdate like 2023-02-20
Use the LocalDate
class to represent a date only without a time-of-day and without an offset or time zone.
Using Java syntax (I've not yet learned Kotlin):
LocalDate today = LocalDate.now() ;
Generally best to be explicit about the time zone used to determine the current date.
ZoneId zoneId = ZoneId.of( "Asia/Seoul" ) ; // Or ZoneId.systemDefault().
LocalDate today = LocalDate.now() ;
TemporalAdjuster
Use a TemporalAdjuster
to move to another day of week. Note the DayOfWeek
enum, defining an object for each day of week.
LocalDate previousOrSameMonday = today.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ) ;
To get the following Sunday, add 6 days.
LocalDate sameOrNextSunday = previousOrSameMonday.plusDays( 6 ) ;
But… A span of time is usually better defined using the Half-Open approach. In Half-Open, the beginning is inclusive while the ending is exclusive. So a week starts on a Monday, running up to, but not including, the following Monday.
LocalDate startNextWeek = previousOrSameMonday.plusWeeks( 1 ) ;
Count from epoch
Apparently you want a count of milliseconds from an epoch reference date. I will assume your epoch reference is the first moment of 1970 as seen in UTC, 1970-01-01T00:00Z.
ZonedDateTime
To do this, we need to get the first moment of the day on that date as seen in a particular time zone.
Do not assume the day starts at 00:00. Some days on some dates in some zones start at another time-of-day such as 01:00. Let java.time determine the first moment of the day.
ZonedDateTime zdtStart = previousOrSameMonday.atStartOfDay( zoneId ) ;
Instant
Extract an Instant
, the same moment but as seen with an offset from UTC of zero hours-minutes-seconds.
Instant instant = zdtStart.toInstant() ;
From the Instant
extract a count from epoch.
long start = instant.toEpochMilli() ;
long end = startNextWeek.atStartOfDay( zoneId ).toInstant().toEpochMilli() ;
Compare
See if a moment lies within that week.
long now = Instant.now().toMilli() ;
if (
( ! now < start )
&&
( now < end )
) { … }
答案2
得分: 0
fun getStartAndEndDayByToday(today: Calendar): ArrayList<String> {
val startAndEndDayArray = ArrayList<String>()
// 获取今天是本周的星期几
val todayWeekDay = today.get(Calendar.DAY_OF_WEEK)
// 下面可以获取本周的开始日期;根据本地时区的不同,它会变化
today.add(Calendar.DAY_OF_MONTH, 1 - todayWeekDay)
val calStartDayOfWeek = today.time
// 下面可以获取本周的结束日期;根据本地时区的不同,它会变化
today.add(Calendar.DAY_OF_MONTH, 6)
val calEndDayOfWeek = today.time
// 在这里,您可以使用SimpleDateFormat设置日期格式
val sdfStartDayOfWeek = SimpleDateFormat("yyyy-MM-dd")
val sdfEndDayOfWeek = SimpleDateFormat("yyyy-MM-dd")
// 将开始日期和结束日期添加到数组中
startAndEndDayArray.add(sdfStartDayOfWeek.format(calStartDayOfWeek))
startAndEndDayArray.add(sdfEndDayOfWeek.format(calEndDayOfWeek))
return startAndEndDayArray
}
希望这对您有帮助!
英文:
fun getStartAndEndDayByToday(today: Calendar): ArrayList<String> {
val startAndEndDayArray = ArrayList<String>()
// Get the day of this week today
val todayWeekDay = today.get(Calendar.DAY_OF_WEEK)
// Below you can get the start day of week; it would be changeable according to local time zone
today.add(Calendar.DAY_OF_MONTH, 1 - todayWeekDay)
val calStartDayOfWeek = today.time
// Below you can get the end day of week; it would be changeable according to local time zone
today.add(Calendar.DAY_OF_MONTH, 6)
val calEndDayOfWeek = today.time
// Here you can set the date format by using SimpleDateFormat
val sdfStartDayOfWeek = SimpleDateFormat("yyyy-MM-dd")
val sdfEndDayOfWeek = SimpleDateFormat("yyyy-MM-dd")
// Make the array with start date and end date
startAndEndDayArray.add(sdfStartDayOfWeek.format(calStartDayOfWeek))
startAndEndDayArray.add(sdfEndDayOfWeek.format(calEndDayOfWeek))
return startAndEndDayArray
}
Hope this would help!
答案3
得分: 0
以下是翻译好的部分:
首先,我们定义我们期望的输出格式。在这种情况下,我们将使用`yyyy-MM-dd`格式。在下一步中,我们将当前日期保存在一个变量中。在第三行,我们定义了我们正在使用的时区(我在测试中使用了`Europe/Berlin`,因为我在德国)。
在接下来的步骤中,我们为每个期望的日期创建了`Calendar`实例,并根据我们的需求操作日期。
重要提示:只有在您的一周开始日期不是星期日时,您才需要添加`firstDayOfWeek = Calendar.MONDAY`这一行。
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
val today = Calendar.getInstance()
val timeZone = TimeZone.getTimeZone("Europe/Berlin")
val startOfWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
}.time
val endOfWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}.time
val startOfLastWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.WEEK_OF_YEAR, today.get(Calendar.WEEK_OF_YEAR) - 1)
set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
}.time
val endOfLastWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.WEEK_OF_YEAR, today.get(Calendar.WEEK_OF_YEAR) - 1)
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}.time
val startOfWeekAsString = dateFormat.format(startOfWeek)
val endOfWeekAsString = dateFormat.format(endOfWeek)
val startOfLastWeekAsString = dateFormat.format(startOfLastWeek)
val endOfLastWeekAsString = dateFormat.format(endOfLastWeek)
println("Start of week: $startOfWeekAsString")
println("End of week: $endOfWeekAsString")
println("Start of last week: $startOfLastWeekAsString")
println("End of last week: $endOfLastWeekAsString")
期望的输出:
Start of week: 2023-02-13
End of week: 2023-02-19
Start of last week: 2023-02-06
End of last week: 2023-02-12
英文:
At first, we define our desired output format. In this case we will use yyyy-MM-dd
. In the next step we save the current date in a variable. In the third line we define timezone in which we are working (I used Europe/Berlin
for testing purposes, bacause I'm in germany).
In the next steps we create Calendar
instance for each desired date and manipulate the date to our needs.
Important: You have to add the line firstDayOfWeek = Calendar.MONDAY
only if your week starts at another date than Sunday.
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
val today = Calendar.getInstance()
val timeZone = TimeZone.getTimeZone("Europe/Berlin")
val startOfWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
}.time
val endOfWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}.time
val startOfLastWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.WEEK_OF_YEAR, today.get(Calendar.WEEK_OF_YEAR) - 1)
set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
}.time
val endOfLastWeek = Calendar.getInstance(timeZone).apply {
firstDayOfWeek = Calendar.MONDAY
set(Calendar.WEEK_OF_YEAR, today.get(Calendar.WEEK_OF_YEAR) - 1)
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}.time
val startOfWeekAsString = dateFormat.format(startOfWeek)
val endOfWeekAsString = dateFormat.format(endOfWeek)
val startOfLastWeekAsString = dateFormat.format(startOfLastWeek)
val endOfLastWeekAsString = dateFormat.format(endOfLastWeek)
println("Start of week: $startOfWeekAsString")
println("End of week: $endOfWeekAsString")
println("Start of last week: $startOfLastWeekAsString")
println("End of last week: $endOfLastWeekAsString")
Expected output:
Start of week: 2023-02-13
End of week: 2023-02-19
Start of last week: 2023-02-06
End of last week: 2023-02-12
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论