ISO datetime с проблемой часового пояса

Как выглядит заголовок С? Где-то источник C должен перечислять допустимые типы обратного вызова. Вы должны воспользоваться этой возможностью, чтобы иметь ряд макросов, которые генерируют прототипы для отдельных функций заглушки, с соответствующей последовательностью макросов в источнике C ++, генерирующим extern "C" заглушки.


Что касается второго вопроса : Да, это работает, но typedef не находится внутри шаблона. Я попытался поместить такой тип typedef внутри класса, но оказывается, что даже шаблоны классов не допускаются внутри extern "C". Таким образом, у вас может быть шаблон функции, но нет параметров зависимого типа.

Простое определение этой функции легко:

extern "C" typedef void ftype(int);

template<typename T>
static ftype f; // <- added "static" here

template< typename T >
void f(int q) {}

Aha, вариативные функции!

extern "C" typedef void ftype( int, ... );

template<typename T>
static ftype f;

template< typename T >
static void f( int z, ... ) {
    va_list va;
    va_start( va, z );
    T v = va_arg( va, T );
    va_end( va );

    std::cout << v;
}

Вам действительно не нужно выводить тип, поскольку это всего лишь обратный вызов, поэтому вы можете передать это & f<int> в код C, все обратные вызовы имеют один и тот же тип, и он может сделать определение типа во время выполнения и передать все он хочет через varargs.

1
задан Java Programmer 18 March 2019 в 16:31
поделиться

1 ответ

java.time

    dateTimeWithTimeZone = Instant.now().toString();
    System.out.println(dateTimeWithTimeZone);

Когда я только что запустил этот фрагмент, я получил такой вывод:

2019-03-18T22: 28: 13.549319Z

На странице, на которую вы ссылаетесь, непонятно, но это строка ISO 8601 в UTC, так что должно быть все, что вам нужно. Я пользуюсь тем фактом, что классы java.time создают выходные данные ISO 8601 из своих методов toString. Связанная страница показывает формат с дефисами, T и двоеточиями (2008-09-15T15:53:00+05:00), показывает еще один пример с десятичными знаками на секундах (15:53:00.322348) и третий пример с Z, означающим UTC (20080915T155300Z) поэтому я ожидаю, что комбинация всех трех из них тоже будет в порядке.

Формат, который вы использовали в квестоне, похоже, пытается получить смещение как +00:00, а не Z. Если это требование, это только немного сложнее. Мы используем явный модуль форматирования для контроля изменений в ISO 8601:

        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);

2019-03-18T22: 28: 13.729711 + 00: 00

Что что-то пошло не так в вашем коде?

Вы пытались использовать символы форматирования из вашего источника с SimpleDateFormat. Во-первых, вы никогда не должны, и особенно в Java 8 или новее, хотеть использовать SimpleDateFormat. Этот класс, как известно, хлопотно и давно устарел. Во-вторых, некоторые из его букв шаблонного формата соответствуют символам из вашего источника, а некоторые - нет, поэтому вы не можете просто использовать строку symvol оттуда. Вместо этого вам нужно прочитать документацию и найти правильные буквы шаблонов формата для использования в качестве года, месяца и т. Д. И помните, что они чувствительны к регистру: MM и mm различаются.

Ссылка

Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

0
ответ дан Ole V.V. 18 March 2019 в 16:31
поделиться
Другие вопросы по тегам:

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