Я использую что-то вроде этого:
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'
Для 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.
blockquote>
Instant.ofEpochSecond( 1_280_512_800L )
2010-07-30T18: 00: 00Z
blockquote>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
blockquote>Посмотрите, что запускается в реальном времени на 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 [Азия / Тегеран]
blockquote>Преобразование из 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 .
Конструктор Date ожидает, что значение timeStamp будет в миллисекундах. Умножьте значение timestamp на 1000, затем передайте его конструктору.
Это правильный путь:
Date date = new Date ();
date.setTime((long)unix_time*1000);
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Похоже, что Календарь - это новый способ:
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
Если вы преобразуете значение метки времени на другую машину, вы также должны проверить часовой пояс этого аппарата. Например:
Приведенные выше описания приведут к различным значениям даты, если вы запускаете часовые пояса EST или UTC.
Чтобы установить часовой пояс; aka to UTC, вы можете просто переписать:
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));