Почему форматирование сегодняшней даты в Android Studio дает 19700101? - PullRequest
0 голосов
/ 06 июня 2018

Вот мой код:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

public static void main(String[] args) {
    Calendar cal = new GregorianCalendar();
    Date date = new Date(System.currentTimeMillis());
    cal.setTime( date );
    if (Calendar.MINUTE < 40) {
        if (Calendar.HOUR_OF_DAY == 0) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
            cal.set(Calendar.HOUR_OF_DAY, 23);
        }
        else
        cal.add(Calendar.HOUR_OF_DAY, -1);
    }
    int z = cal.get(Calendar.DAY_OF_MONTH);
    int w = cal.get(Calendar.HOUR_OF_DAY);
    SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
    SimpleDateFormat sdf_nowbasetime = new SimpleDateFormat("HH");

    String baseDate_now = sdf_nowbasedate.format(z);
    String baseTime_now = sdf_nowbasetime.format(w)+ "00";

System.out.println(baseDate_now + " " + baseTime_now);

Результат, который я ожидаю, это "20180606 1200" (потому что сейчас время написания этой статьи - 6 июня 2018 года, 13:12 (KST - я живу в Корее)

Но результат «19700101 0900»

Почему возникает эта ошибка?

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

вы должны передать Date в sdf_nowbasedate.format(Date) вместо int ("z" или "w"), так как при использовании календаря вы должны получить дату

String baseDate_now = sdf_nowbasedate.format(cal.getTime());
String baseTime_now = sdf_nowbasetime.format(cal.getTime())+ "00";
0 голосов
/ 06 июня 2018

java.time

Другие ответы правильно объяснили, почему ваш код дал вам дату 1 января 1970 года. Я хотел бы представить современную правильную версию кода.Я думаю, что вы ищете что-то вроде этого:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd HHmm");
    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
    if (zdt.getMinute() < 40) {
        zdt = zdt.minusHours(1);
    }
    ZonedDateTime wholeHours = zdt.truncatedTo(ChronoUnit.HOURS);
    String baseNow = wholeHours.format(formatter);
    System.out.println(baseNow);

Запустив это прямо сейчас (00:52 в Южной Корее), оно напечатало:

20180607 0000

Я использую java.time, современный Java-интерфейс даты и времени, потому что Calendar, GregorianCalendar, Date и SimpleDateFormat все давно устарели и плохо разработаны, а java.time намного приятнееработать с.

Кажется, есть еще одна ошибка в вашем коде.Calendar.MINUTE и Calendar.HOUR_OF_DAY являются константами со значениями 12 и 11, поэтому Calendar.MINUTE < 40 всегда будет истинным, а Calendar.HOUR_OF_DAY == 0 никогда не будет.Вместо этого вы, вероятно, намеревались cal.get(Calendar.MINUTE) и аналогично для часа дня.Урок для изучения: со старыми классами очень легко совершать ошибки, а также те, которые остаются незамеченными, а другие трудно определить.Я рекомендую вам избегать этих классов.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (более старом) использовании AndroidAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 06 июня 2018
int z = cal.get(Calendar.DAY_OF_MONTH);
int w = cal.get(Calendar.HOUR_OF_DAY);
SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
String baseDate_now = sdf_nowbasedate.format(z);    

Во-первых, этот код не может даже скомпилироваться.Не существует функции форматирования, которая принимает целое число в качестве параметра.Требуется свидание.Но если предположить, что вы на самом деле каким-то образом делаете дату из этого числа - это сделает вашу дату в основном на несколько десятков мс от времени эпохи, 1 января 1970 года.

Вместо этого передайте дату вформатировать напрямую.

...