Nano Hash - криптовалюты, майнинг, программирование

Строка для объекта календаря

Вот мой целевой формат:

19 августа 2011 г.

И я пытаюсь преобразовать эту строку в объект календаря, используя следующий код, но переменная «дата» остается нулевой.

SimpleDateFormat formatter ; 
        Date date = null ; 
        formatter = new SimpleDateFormat("dd MMM yyyy");
        try {
         date = formatter.parse(returnDate);
    } catch (ParseException e) {            
        e.printStackTrace();
    } 
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);

Кто-нибудь знает, что происходит не так? Благодарю вас.

К вашему сведению, сообщение об исключении:

Неразборная дата: «19 августа 2011 г.» в java.text.DateFormat.parse (неизвестный источник)

Но я не думаю, что это полезно...

17.08.2011

  • не могу воспроизвести, это работает, как и ожидалось для меня 17.08.2011
  • Исключение абсолютно является полезным и должно всегда предоставляться при задании вопроса. Тот факт, что date по-прежнему равен нулю, является второстепенным — это исключение, которое вам нужно исправить. См. В нижней части моего ответа предлагаемое решение. 17.08.2011

Ответы:


1

Что-то не так с парсингом. Вы не узнаете об этом из-за этого:

 catch (ParseException e) {            

 } 

По сути, это означает: «Меня не волнует, что пойдет не так, — игнорируй это». Как минимум по крайней мере вы должны регистрировать ошибку и, что более вероятно, позволить исключению всплывать.

Исключения — невероятно важный диагностический инструмент — не просто перехватывайте их и игнорируйте.

РЕДАКТИРОВАТЬ: Теперь, когда вопрос изменился, мы видим исключение, но код все еще продолжается, как будто ничего не произошло. Даже если вы действительно хотите в основном игнорировать исключение, вам нужно решить, какое значение вы хотите date иметь в случае сбоя синтаксического анализа. Ясно, что null бесполезен, поэтому вам нужно либо позволить всплыть исключению (чтобы сообщить вызывающей стороне, что синтаксический анализ не удался) или вернуть какое-то значение разницы (например, дату по умолчанию, или сегодня, или что-то в этом роде).

Теперь, когда это случается, позволяя всплывать исключениям, мы также упрощаем код. На моей машине это не вызывает исключения, но, возможно, на вашей:

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String[] args) throws Exception {
      Calendar cal = parseReturnDate("19 AUG 2011");
      System.out.println(cal);
    }

    public static Calendar parseReturnDate(String returnDate) 
        throws ParseException {
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
      Date date = formatter.parse(returnDate);
      Calendar cal=Calendar.getInstance();
      cal.setTime(date);
      return cal;
    }       
}

Обратите внимание, что нам не нужно объявлять переменные отдельно, чтобы присвоить им значения, и теперь, когда мы позволяем исключению всплывать, мы можем просто присвоить date его полезное значение напрямую.

Я предполагаю, что в вашем часовом поясе по умолчанию не используется "AUG" в качестве короткого названия месяца, но я не могу точно сказать, не видя исключения. Если это так, вы можете указать локаль при создании средства форматирования:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",
                                                  Locale.US);

Вы можете также указать часовой пояс.

(Кроме того, Joda Time – гораздо более совершенный API для обработки даты и времени. Если вы Если впоследствии вы будете выполнять какую-либо существенную работу со значением, я определенно рекомендую использовать его в течение Date/Calendar.)

17.08.2011
  • Кроме того, если вам интересно, что вставить в эту крылатую фразу, попробуйте e.printStackTrace();. ;) 17.08.2011
  • Я знаю ошибку. Это исключение нулевого указателя, так как синтаксический анализ завершается сбоем, а дата остается нулевой. Я просто удаляю оператор исключения для простоты, спасибо 17.08.2011
  • @Bear: Итак, вы уже получили свой ответ - это потому, что синтаксический анализ не удался. Вы решили попытаться игнорировать сбой синтаксического анализа, так какое же значение вы ожидали date иметь? Почему бы вам не сосредоточиться на исправлении ошибки синтаксического анализа? Чтобы мы могли диагностировать сбой синтаксического анализа, вы должны сообщить нам, какое исключение было сгенерировано. 17.08.2011
  • Благодарю вас. я приму твой совет 17.08.2011

  • 2

    SimpleDateFormat зависит от текущего календаря и календаря локали по умолчанию. В зависимости от локали и календаря, вероятно, «AUG» не является допустимым текстом для месяца.

    AUG является допустимой строкой для локали США, но, например, не для локали ES.

    Вы можете принудительно установить локаль в США, добавив ее в SimpleDateFormat:

    SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",Locale.US);
    

    С локалью США вы можете правильно проанализировать строку, если дата имеет 2-буквенные месяцы США.

    17.08.2011

    3

    Я только что попробовал ваш код, и он отлично работает. Попробуйте запустить следующее:

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class Playground {
        
        public static void main(String... args) {
        
            String returnDate = "19 AUG 2011";
            SimpleDateFormat formatter ; 
            Date date = null ; 
            formatter = new SimpleDateFormat("dd MMM yyyy");
        
            try {
                date = formatter.parse(returnDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        
            System.out.println(date.toString());
        
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
        
            System.out.println(cal.getTime().toString());
        }
    }
    

    ВЫВОД:

    Пт 19 авг 00:00:00 CAT 2011

    Пт 19 авг 00:00:00 CAT 2011

    17.08.2011
  • @Bear: Вы говорите, что уже подозревали, что проблема может быть связана с локалью? Если да, то почему вы не сообщили об использовании своего языкового стандарта для начала? 17.08.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..