package com.levelup.java.date; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.number.OrderingComparison.greaterThanOrEqualTo; import static org.hamcrest.number.OrderingComparison.lessThanOrEqualTo; import static org.junit.Assert.assertThat; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import org.apache.log4j.Logger; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; /** * This java example will demonstrate getting a random date within * a given year. * * @author Justin Musgrove * @see <a href='http://www.leveluplunch.com/java/examples/generate-random-date/'>Generate random date</a> * */ public class GenerateRandomDate { private static final Logger logger = Logger.getLogger(GenerateRandomDate.class); private long beginTime; private long endTime; @Before public void setUp () { beginTime = Timestamp.valueOf("2013-01-01 00:00:00").getTime(); endTime = Timestamp.valueOf("2013-12-31 00:58:00").getTime(); } /** * Method should generate random number that represents * a time between two dates. * * @return */ private long getRandomTimeBetweenTwoDates () { long diff = endTime - beginTime + 1; return beginTime + (long) (Math.random() * diff); } @Test public void generate_random_date_java() { SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss"); for (int x = 0; x < 7; x++) { Date randomDate = new Date(getRandomTimeBetweenTwoDates()); logger.info(dateFormat.format(randomDate)); assertThat( randomDate.getTime(), allOf(lessThanOrEqualTo(endTime), greaterThanOrEqualTo(beginTime))); } } @Test public void generate_random_date_java8() { DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); for (int x = 0; x < 7; x++) { Instant instant = Instant.ofEpochSecond(getRandomTimeBetweenTwoDates()); LocalDateTime randomDate = LocalDateTime.ofInstant(instant, ZoneId.of("UTC-06:00")); logger.info(randomDate.format(format)); assertThat( randomDate.atZone(ZoneId.of("UTC-06:00")).toEpochSecond(), allOf(lessThanOrEqualTo(endTime), greaterThanOrEqualTo(beginTime))); } } @Test public void generate_random_date_joda () { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); for (int x=0; x < 7; x ++) { DateTime randomDate = new DateTime(getRandomTimeBetweenTwoDates()); logger.info(dateFormat.format(randomDate.getMillis())); assertThat( randomDate.getMillis(), allOf(lessThanOrEqualTo(endTime), greaterThanOrEqualTo(beginTime))); } } }