Что в Scala означает «месяц» в нижнем регистре?

Я обнаружил очень странную проблему в Scala. Я пытался получить последний день прошлого месяца. Следующий рабочий лист показал правильный результат (в Scala месяц начинается с 0 (январь), поэтому мар - 2).

Что в Scala означает «месяц» в нижнем регистре?

Однако, если я закомментирую последнюю строку слева, результаты будут следующими:

Что в Scala означает «месяц» в нижнем регистре?

Я просто присвоил lastMonth переменную month. И lastMonth поменяли на 3!

Где я сделал не так?

Вот фрагмент кода:

import java.util.{Calendar, GregorianCalendar} // Get current time and the last date of last month

val now = Calendar.getInstance()
// test code
//now.set(Calendar.MONTH, Calendar.DECEMBER)

// get current year
val currYear = now.get(Calendar.YEAR)
// get current month, JANUARY is 0
val currMonth = now.get(Calendar.MONTH)

// back to last month
val lastMonthCalendar = now
// if this month is Dec, the YEAR would be automatically deducted by 1
lastMonthCalendar.add(Calendar.MONTH, -1)
lastMonthCalendar.getTime
val lastMonth = lastMonthCalendar.get(Calendar.MONTH)
val numDaysOfLastMonth = lastMonthCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)
lastMonthCalendar.set(Calendar.DATE, numDaysOfLastMonth)
lastMonthCalendar.getTime

var year = lastMonthCalendar.get(Calendar.YEAR)
var month = lastMonth

Ну lastMonth это апрель = 4-1 = 3 ... В чем проблема?

OneCricketeer 25.04.2018 23:10

В любом случае вы должны использовать LocalDate, а не Calendar

OneCricketeer 25.04.2018 23:11

Нет, в календаре 3 апреля. lastMonth должно быть 2

Bella Wang 25.04.2018 23:16
Calendar.APRIL будет 3. calendarInstance.get(Calendar.MONTH) будет 4.
OneCricketeer 25.04.2018 23:20

Да, LocalDate работает, но почему Calendar не работает?

Bella Wang 25.04.2018 23:21

Но единственное различие между этими двумя частями - это финальная строка. Я просто присвоил значение переменной ...

Bella Wang 25.04.2018 23:24

lastMonth и month всегда имеют одно и то же значение ... И будет 3, потому что сейчас март, третий месяц ... нет будет два. Я не понимаю, что вы ищете, но примите мой ответ ниже, если это то, что вы хотите в коде

OneCricketeer 26.04.2018 02:33

Для тех из нас, у кого старые глаза, кто забыл свои очки, не могли бы вы подытожить в тексте то, что показывают изображения?

Ole V.V. 26.04.2018 06:37

Это не воспроизводится. Я получаю 2 для обеих переменных.

Jasper-M 26.04.2018 08:33

@ cricket_007 В классе календаря МЕСЯЦ начинается с 0. ЯНВАРЬ - 0, МАРТ - 2.

Bella Wang 26.04.2018 16:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

get the last day of last month

Это то, что вы хотите?

scala> import java.time.LocalDate
import java.time.LocalDate

scala>  LocalDate.now().withDayOfMonth(1).minusDays(1)
res1: java.time.LocalDate = 2018-03-31

scala> res1.getDayOfMonth
res2: Int = 31

scala> res1.getMonth
res3: java.time.Month = MARCH

scala> res1.getMonthValue
res4: Int = 3

Спасибо! LocalDate действительно пригодится!

Bella Wang 25.04.2018 23:31

Другие вопросы по теме