Время Unix до нормального времени [дубликат]

Я использую что-то вроде этого:

import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequense(unittest.TestCase):
    pass

def test_generator(a, b):
    def test(self):
        self.assertEqual(a,b)
    return test

if __name__ == '__main__':
    for t in l:
        test_name = 'test_%s' % t[0]
        test = test_generator(t[1], t[2])
        setattr(TestSequense, test_name, test)
    unittest.main()

Пакет nose-parameterized может использоваться для автоматизации этого процесса:

from nose_parameterized import parameterized

class TestSequence(unittest.TestCase):
    @parameterized.expand([
        ["foo", "a", "a",],
        ["bar", "a", "b"],
        ["lee", "b", "b"],
    ])
    def test_sequence(self, name, a, b):
        self.assertEqual(a,b)

Какой будет генерировать тесты:

test_sequence_0_foo (__main__.TestSequence) ... ok
test_sequence_1_bar (__main__.TestSequence) ... FAIL
test_sequence_2_lee (__main__.TestSequence) ... ok

======================================================================
FAIL: test_sequence_1_bar (__main__.TestSequence)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/nose_parameterized/parameterized.py", line 233, in 
    standalone_func = lambda *a: func(*(a + p.args), **p.kwargs)
  File "x.py", line 12, in test_sequence
    self.assertEqual(a,b)
AssertionError: 'a' != 'b'

202
задан Eric Leschinski 19 September 2014 в 21:01
поделиться

7 ответов

Для 1280512800 умножьте на 1000, так как java ожидает миллисекунды:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Если у вас уже есть миллисекунды, тогда просто new java.util.Date((long)timeStamp);

Из documentation :

Выделяет объект Date и инициализирует его для представления указанного количества миллисекунд с момента стандартного базового времени, известного как «эпоха», а именно 1 января 1970 года, 00 : 00: 00 GMT.

379
ответ дан cricket_007 25 August 2018 в 12:37
поделиться

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

новая инфраструктура java.time, встроенная в Java 8, а затем является преемником Joda-Time.

Эти новые классы включают удобный заводский метод для преобразования количества целых секунд с эпохи. Вы получаете Instant, момент на шкале времени в UTC с разрешением до наносекунд.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Посмотрите, что запускается в реальном времени на IdeOne.com .

Asia/Kabul или Asia/Tehran часовых поясах?

Вы сообщили о том, чтобы получить значение в дневное время 22:30 вместо 18:00 здесь. Я подозреваю, что ваша утилита PHP неявно применяет часовой пояс по умолчанию для настройки с UTC. Мое значение здесь UTC, обозначенное Z (сокращение от Zulu, означает UTC). Любая вероятность того, что ваша ОС или PHP установлена ​​на Asia/Kabul или Asia/Tehran часовые пояса? Я полагаю, что вы сообщаете IRST в своем выпуске, что, по-видимому, означает время в Иране. В настоящее время в 2017 году это единственные зоны , работающие с летним временем, которое составляет четыре с половиной часа перед UTC.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal , Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, например EST или IST или IRST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

Если вы хотите видеть ваш момент через объектив часового пояса конкретного региона, примените ZoneId, чтобы получить ZonedDateTime . Тем не менее тот же одновременный момент, но рассматривается как другое время настенных часов .

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22: 30 + 04: 30 [Азия / Тегеран]

Преобразование из java.time в устаревшие классы

Вы должны придерживаться новых классов java.time.

java.util.Date date = java.util.Date.from( instant );

Joda-Time

UPDATE: проект Joda-Time теперь находится в сервисе mode , при этом команда советует перейти на классы java.time .

FYI, конструктор для Joda-Time DateTime подобен: умножьте на тысячу, чтобы создать long (а не int !).

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

Лучше избегать печально известных проблемных классов java.util.Date и .Calendar. Но если вы должны использовать дату, вы можете конвертировать из Joda-Time.

java.util.Date date = dateTime.toDate();

О java.time

java.time framework встроен в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые классы времени legacy , такие как java.util.Date , Calendar и & amp; SimpleDateFormat .

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на java.time .

Чтобы узнать больше, см. учебное пособие Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте драйвер JDBC , соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в классах java.sql.*.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 и более поздние версии. Часть стандартного Java API с интегрированной реализацией. Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7 Большая часть функций java.time портирована на Java 6 & amp; 7 в ThreeTen-Backport .
  • Android Более поздние версии реализаций пакетов Android классов java.time. Для более ранних Android (& lt; 26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP ... .

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и more .

40
ответ дан Basil Bourque 25 August 2018 в 12:37
поделиться

Конструктор Date ожидает, что значение timeStamp будет в миллисекундах. Умножьте значение timestamp на 1000, затем передайте его конструктору.

11
ответ дан f1sh 25 August 2018 в 12:37
поделиться

Это правильный путь:

Date date = new Date ();
date.setTime((long)unix_time*1000);
42
ответ дан Marco Fantasia 25 August 2018 в 12:37
поделиться
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
-2
ответ дан Masatsugu Hosoi 25 August 2018 в 12:37
поделиться

Похоже, что Календарь - это новый способ:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

Последняя строка - это просто пример того, как ее использовать, например, «14.06.2012».

Если вы использовали System.currentTimeMillis (), чтобы сохранить временную метку, вам не нужна часть «* 1000».

Если у вас есть метка времени в строке, вам нужно сначала ее разобрать, как long: Long.parseLong (временная метка).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

25
ответ дан Ricbit 25 August 2018 в 12:37
поделиться

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

Приведенные выше описания приведут к различным значениям даты, если вы запускаете часовые пояса EST или UTC.

Чтобы установить часовой пояс; aka to UTC, вы можете просто переписать:

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
7
ответ дан tmr 25 August 2018 в 12:37
поделиться
Другие вопросы по тегам:

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