Как преобразовать шаблон String & ldquo; 5 апреля 2018 11:25:00 AM CEST & rdquo; в DateTime в C # [дубликат]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

38
задан Matt Johnson 30 June 2014 в 18:12
поделиться

6 ответов

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

DateTime dt1 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+2"), "dd-MMM-yy HH:mm:ss z", culture);
DateTime dt2 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02"), "dd-MMM-yy HH:mm:ss zz", culture);
DateTime dt3 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02:00"), "dd-MMM-yy HH:mm:ss zzz", culture);
31
ответ дан Panos 18 August 2018 в 10:19
поделиться
  • 1
    Будет ли это обрабатывать Daylight Time? – Vitaliy Ulantikov 17 March 2013 в 13:09
  • 2
    Нет, это не так, поскольку здесь смещение указывается вручную. – gzak 23 December 2015 в 18:15
  • 3
    Он будет, если у вас есть вызов Replace для всех часовых поясов, которые вы можете получить, а исходная дата использует правильный часовой пояс (например, не использует NEST, когда они имеют значение EDT) – thelem 5 July 2018 в 16:00
  • 4

У меня есть два ответа, потому что я не совсем уверен, что вы просите.

1) Я вижу, что вы используете CultureInfo, поэтому, если вы просто хотите отформатировать дату и время для конкретной культуры , Я бы выделил дату / время и часовой пояс, применил метод культуры на дату / время и добавил часовой пояс. Если «CEST» отличается для разных культур, вам придется изменить его, указав все параметры (возможно, в случае case).

2) Если вы хотите, чтобы дата / время было преобразовано в другой часовой пояс, вы не можете использовать CultureInfo,

Я предлагаю прочитать: http://msdn.microsoft .com / en-us / library / ms973825.aspx

Вы также можете использовать .net framework 3.5 class TimeZoneInfo (отличный от TimeZone), чтобы облегчить вашу жизнь.

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

3
ответ дан hmak 18 August 2018 в 10:19
поделиться

Быстрый ответ: вы не можете этого сделать.


Вот почему

Существует окончательная база данных мировых часовых поясов, вы можете получить ее от IANA здесь .

Проблема состоит в том, что аббревиатуры 3 или 4 буквы имеют многозначную связь с часовыми поясами IANA. Например, "AMT" означает разные вещи, в зависимости от вашей культуры, в какой части мира вы находитесь и в контексте вашего приложения.

AMT "Armenia Time" Asia          UTC + 4 hours 
AMT "Amazon Time"  South America UTC - 4 hours 

Если вы действительно хотите Чтобы решить эту проблему, я предлагаю использовать Noda Time для представления ваших Instance s. Вам нужно будет написать код для преобразования сокращений в стандартный часовой пояс IANA.

Мы не можем сделать это для вас, это зависит от контекста вашего приложения.


Другим хорошим примером является "CST" .

CST "China Standard Time"   Asia            UTC + 8 hours 
CST "Central Standard Time" Central America UTC - 6 hours 
CST "Cuba Standard Time"    Caribbean       UTC - 5 hours 
CST "Central Standard Time" North America   UTC - 6 hours 
18
ответ дан Jodrell 18 August 2018 в 10:19
поделиться
  • 1
    Технически это все еще выполнимо, поскольку вы можете передать объект CultureInfo в синтаксический анализатор для устранения неоднозначности вашего контекста. – gzak 23 December 2015 в 18:17
  • 2
    @gzak, да, если бы вы хотели, чтобы аббревиатуры были локализованы для прошедшей культуры, вы могли бы выработать сопоставления. – Jodrell 22 March 2016 в 09:41
  • 3
    Нет, не мог. Информация о культуре расскажет вам о языке пользователя и культурных предпочтениях. Он не расскажет вам о часовом поясе пользователя. Моя культура может быть en-US, даже если я посещаю Японию. – Matt Johnson 30 October 2017 в 16:27
  • 4
    @MattJohnson, но если ваша культура en-US, мы можем сделать вывод, что CST означает "Central Standard Time" North America UTC -6 для вас независимо от вашего часового пояса, даже если это UTC-5. Конечно, то, что подходит для одного приложения, может быть неуместным для другого. В абстрактном, вы не можете сказать, как говорится в моем ответе. С достаточным контекстом, частью которого была бы его культура, мы могли бы сказать. – Jodrell 30 October 2017 в 17:01
  • 5
    & Quot; EN-US & Quot; означает «английский, как говорят в Соединенных Штатах». Другими словами, США относятся к диалекту, а не к месту. Почему было бы правильным вывести Центральное стандартное время из КНТ только потому, что я говорю по-английски так, как это делают американцы? Конечно, американцы говорят, что «КНТ», но мы могли бы также сказать, что, ссылаясь на Китай, особенно если мы оказались в Китае. :) – Matt Johnson 30 October 2017 в 17:07

Словарь сокращений, если вы решите пойти на поиск и заменить маршрут (я сделал).

Dictionary<string, string> _timeZones = new Dictionary<string, string>() {
            {"ACDT", "+1030"},
            {"ACST", "+0930"},
            {"ADT", "-0300"},
            {"AEDT", "+1100"},
            {"AEST", "+1000"},
            {"AHDT", "-0900"},
            {"AHST", "-1000"},
            {"AST", "-0400"},
            {"AT", "-0200"},
            {"AWDT", "+0900"},
            {"AWST", "+0800"},
            {"BAT", "+0300"},
            {"BDST", "+0200"},
            {"BET", "-1100"},
            {"BST", "-0300"},
            {"BT", "+0300"},
            {"BZT2", "-0300"},
            {"CADT", "+1030"},
            {"CAST", "+0930"},
            {"CAT", "-1000"},
            {"CCT", "+0800"},
            {"CDT", "-0500"},
            {"CED", "+0200"},
            {"CET", "+0100"},
            {"CEST", "+0200"},
            {"CST", "-0600"},
            {"EAST", "+1000"},
            {"EDT", "-0400"},
            {"EED", "+0300"},
            {"EET", "+0200"},
            {"EEST", "+0300"},
            {"EST", "-0500"},
            {"FST", "+0200"},
            {"FWT", "+0100"},
            {"GMT", "GMT"},
            {"GST", "+1000"},
            {"HDT", "-0900"},
            {"HST", "-1000"},
            {"IDLE", "+1200"},
            {"IDLW", "-1200"},
            {"IST", "+0530"},
            {"IT", "+0330"},
            {"JST", "+0900"},
            {"JT", "+0700"},
            {"MDT", "-0600"},
            {"MED", "+0200"},
            {"MET", "+0100"},
            {"MEST", "+0200"},
            {"MEWT", "+0100"},
            {"MST", "-0700"},
            {"MT", "+0800"},
            {"NDT", "-0230"},
            {"NFT", "-0330"},
            {"NT", "-1100"},
            {"NST", "+0630"},
            {"NZ", "+1100"},
            {"NZST", "+1200"},
            {"NZDT", "+1300"},
            {"NZT", "+1200"},
            {"PDT", "-0700"},
            {"PST", "-0800"},
            {"ROK", "+0900"},
            {"SAD", "+1000"},
            {"SAST", "+0900"},
            {"SAT", "+0900"},
            {"SDT", "+1000"},
            {"SST", "+0200"},
            {"SWT", "+0100"},
            {"USZ3", "+0400"},
            {"USZ4", "+0500"},
            {"USZ5", "+0600"},
            {"USZ6", "+0700"},
            {"UT", "-0000"},
            {"UTC", "-0000"},
            {"UZ10", "+1100"},
            {"WAT", "-0100"},
            {"WET", "-0000"},
            {"WST", "+0800"},
            {"YDT", "-0800"},
            {"YST", "-0900"},
            {"ZP4", "+0400"},
            {"ZP5", "+0500"},
            {"ZP6", "+0600"}
        };
8
ответ дан Jussi Palo 18 August 2018 в 10:19
поделиться
  • 1
    Извините, но этот подход ненадежен. Любой жестко обозначенный список аббревиатуры к офсетному выражению относится к двусмысленности, и это всего лишь моментальный снимок во времени. – Matt Johnson 16 November 2015 в 18:27
  • 2
    Конечно, это является. В равной степени (un) надежна, как использование этих нестандартизированных часовых поясов в первую очередь. Мой ответ просто подкрепляет принятый ответ. Помните также проголосовать за это. – Jussi Palo 17 November 2015 в 08:03
  • 3
    Некоторые люди (я пойду еще дальше и скажу больше всего) фактически получаю данные, относящиеся к одной культуре. Такой подход, хотя и неэффективен, будет достаточным. – Vincent Vancalbergh 17 November 2015 в 09:04
  • 4
    Это является ненадежным даже для одной культуры. За последние 4 года Россия меняла правила летнего времени. Сопоставление аббревиатуры с именем IANA или Windows tz и поиском текущих правил является гораздо более надежным – Panagiotis Kanavos 15 March 2017 в 15:02

Вот что я должен был сделать.

Я получаю datetime из javascript, а затем передаю его ASP.NET для хранения в базе данных Oracle. Вот мой код C # для Восточного и Центрального времени.

string datetimevalue = hidfileDateTime.Value; 

datetimevalue= datetimevalue.Replace("EDT", "EST"); 
datetimevalue = datetimevalue.Replace("CDT", "CST");
if (datetimevalue.Contains("CST"))
{
    filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss CST yyyy", provider).ToUniversalTime().AddHours(1).ToLocalTime();
}
else
{
    filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss EST yyyy", provider);
}
-1
ответ дан luke 18 August 2018 в 10:19
поделиться

Necromancing. Здесь много плохих ответов.

Вот как:

  1. Получить строку (предварительное условие: формат: ddd, dd MMM yyyy HH: mm: ss zzz)
  2. Получить last whitespace
  3. Удалить zzz из строки, но сохранить значение zzz
  4. Смещение поиска для zzz
  5. Добавить смещение в строку
< blockquote>
string dateString = reader.ReadContentAsString();
int timeZonePos = dateString.LastIndexOf(' ') + 1;
string tz = dateString.Substring(timeZonePos);
dateString = dateString.Substring(0, dateString.Length - tz.Length );
dateString += s_timeZoneOffsets[tz];

// https://msdn.microsoft.com/en-us/library/w2sa9yss(v=vs.110).aspx
//string es = reader.ReadElementString("pubDate");
this.m_value = System.DateTime.ParseExact(dateString, "ddd, dd MMM yyyy HH:mm zzz", System.Globalization.CultureInfo.InvariantCulture);

с

private static System.Collections.Generic.Dictionary<string, string> s_timeZoneOffsets =
    new System.Collections.Generic.Dictionary<string, string>() {
    {"ACDT", "+10:30"},
    {"ACST", "+09:30"},
    {"ADT", "-03:00"},
    {"AEDT", "+11:00"},
    {"AEST", "+10:00"},
    {"AHDT", "-09:00"},
    {"AHST", "-10:00"},
    {"AST", "-04:00"},
    {"AT", "-02:00"},
    {"AWDT", "+09:00"},
    {"AWST", "+08:00"},
    {"BAT", "+03:00"},
    {"BDST", "+02:00"},
    {"BET", "-11:00"},
    {"BST", "-03:00"},
    {"BT", "+03:00"},
    {"BZT2", "-03:00"},
    {"CADT", "+10:30"},
    {"CAST", "+09:30"},
    {"CAT", "-10:00"},
    {"CCT", "+08:00"},
    {"CDT", "-05:00"},
    {"CED", "+02:00"},
    {"CET", "+01:00"},
    {"CEST", "+02:00"},
    {"CST", "-06:00"},
    {"EAST", "+10:00"},
    {"EDT", "-04:00"},
    {"EED", "+03:00"},
    {"EET", "+02:00"},
    {"EEST", "+03:00"},
    {"EST", "-05:00"},
    {"FST", "+02:00"},
    {"FWT", "+01:00"},
    {"GMT", "+00:00"},
    {"GST", "+10:00"},
    {"HDT", "-09:00"},
    {"HST", "-10:00"},
    {"IDLE", "+12:00"},
    {"IDLW", "-12:00"},
    {"IST", "+05:30"},
    {"IT", "+03:30"},
    {"JST", "+09:00"},
    {"JT", "+07:00"},
    {"MDT", "-06:00"},
    {"MED", "+02:00"},
    {"MET", "+01:00"},
    {"MEST", "+02:00"},
    {"MEWT", "+01:00"},
    {"MST", "-07:00"},
    {"MT", "+08:00"},
    {"NDT", "-02:30"},
    {"NFT", "-03:30"},
    {"NT", "-11:00"},
    {"NST", "+06:30"},
    {"NZ", "+11:00"},
    {"NZST", "+12:00"},
    {"NZDT", "+13:00"},
    {"NZT", "+12:00"},
    {"PDT", "-07:00"},
    {"PST", "-08:00"},
    {"ROK", "+09:00"},
    {"SAD", "+10:00"},
    {"SAST", "+09:00"},
    {"SAT", "+09:00"},
    {"SDT", "+10:00"},
    {"SST", "+02:00"},
    {"SWT", "+01:00"},
    {"USZ3", "+04:00"},
    {"USZ4", "+05:00"},
    {"USZ5", "+06:00"},
    {"USZ6", "+07:00"},
    {"UT", "-00:00"},
    {"UTC", "-00:00"},
    {"UZ10", "+11:00"},
    {"WAT", "-01:00"},
    {"WET", "-00:00"},
    {"WST", "+08:00"},
    {"YDT", "-08:00"},
    {"YST", "-09:00"},
    {"ZP4", "+04:00"},
    {"ZP5", "+05:00"},
    {"ZP6", "+06:00"}
};
1
ответ дан Stefan Steiger 18 August 2018 в 10:19
поделиться
  • 1
    Спасибо. Да, было много плохих ответов. – JohnB 30 March 2018 в 04:57
  • 2
    Это по-прежнему плохой ответ по причинам, обсуждаемым в других разделах этой страницы. Вы - предположения о жестком кодировании о том, какие аббревиатуры типа «AMT» или "CST" имею в виду. Проблема в том, что у этого вопроса нет хорошего ответа; коды неоднозначны, и таблица поиска не может быть окончательной. Возможно, этих предположений было достаточно для решения проблемы ОП, но они не были указаны в вопросе. – Ryan Bemrose 28 May 2018 в 20:52
Другие вопросы по тегам:

Похожие вопросы: