如何使用日历数据类型从现在开始获得一个月?

问题描述 投票:0回答:3

我想在我的日期选择器对话框中设置最大日期enter image description here

如您所见,它需要Calendar数据类型作为输入。

我希望最长日期总是从当前时间开始一个月。我已经尝试过像这样

        val now = Calendar.getInstance()
        val currentYear: Int = now.get(Calendar.YEAR)
        val currentMonth: Int = now.get(Calendar.MONTH)
        val currentDay: Int = now.get(Calendar.DAY_OF_MONTH)

        val oneMonthFromNow = now.add(Calendar.MONTH,1)

但是oneMonthFromNow类型是unit,而不是Calendar数据类型。那么如何从当前日期时间动态添加一个月?

java或kotlin可以

android android-calendar
3个回答
1
投票

首先要说的是不使用Calendar类,请改用LocalDateTime。您将获得许多有关如何使用此类以及使用原因的文章。


即使您要使用Calendar类,也要说,如果有什么不起作用或不返回任何东西,您应该研究该类的实现。必须有一种解决您的问题的方法。这样可以增加您的知识以及调试技能。

因此,要解决您的问题,您需要像这样使用

    val now = Calendar.getInstance()
    // val currentYear: Int = now.get(Calendar.YEAR)
    // val currentMonth: Int = now.get(Calendar.MONTH)
    // val currentDay: Int = now.get(Calendar.DAY_OF_MONTH)

    now.add(Calendar.MONTH,1) // Added one month 
    val oneMonthFromNow = now
    // Or 
    // val oneMonthFromNow = now.clone()
    // oneMonthFromNow.add(Calendar.MONTH,1)

1
投票

now.add(Calendar.MONTH,1)返回类型为单位,因为它正在更新您的now日历

val now = Calendar.getInstance() // it return current calendar
    val currentYear: Int = now.get(Calendar.YEAR)
    val currentMonth: Int = now.get(Calendar.MONTH)
    val currentDay: Int = now.get(Calendar.DAY_OF_MONTH)

    //now calendar updated by 1 month
    now.add(Calendar.MONTH,1)

    //this will return your upcoming dates
     val nextYear: Int = now.get(Calendar.YEAR)
    val nextMonth: Int = now.get(Calendar.MONTH)
    val nextDay: Int = now.get(Calendar.DAY_OF_MONTH)

0
投票

tl; dr

Calendar c =
GregorianCalendar 
.from(
    LocalDate
    .now(
        ZoneId.systemDefault()
    )                            // Returns a `LocalDate` object.
    .plusMonths( 1 )
    .atStartOfDay(
        ZoneId.systemDefault()
    )                            // Returns a `ZonedDateTime` object. 
)
;

java.time

现代方法使用了几年前的java.time类,该类取代了可怕的传统日期时间类,例如Calendar

获取今天的日期。这需要一个时区。在任何给定时刻,日期都会在全球范围内变化。

ZoneId z = ZoneId.of( "Africa/Tunis" ; 

或获取JVM的当前默认时区。

ZoneId z = ZoneId.systemDefault() ;

获取今天的日期。

LocalDate today = LocalDate.now( z ) ;

一个月后得到。

LocalDate monthLater = today.plusMonths( 1 ) ;

如果要与尚未更新的旧代码进行交互,请使用<< java.time,在旧类和现代类之间来回转换。

要进行转换,请通过ZonedDateTime获得第一天。

ZonedDateTime zdt = monthLater.atStaetOfDay( z ) ;

然后转换为也是GregorianCalendarCalendar

GregorianCalendar gc = GregorianCalendar.from( zdt ) ;

© www.soinside.com 2019 - 2024. All rights reserved.