So i have Entity called Group, i have private LocalDate starttime; and private LocalDate endtime; and i have also private boolean finished =Boolean.FALSE; i want to write method or code (with validations) that when group is registered its starttime must start from that exact day or 1 months after, and its endtime must be after 3 or 6 month later and when endtime comes it should become finished(in db) help
So i have Entity called Group, i have private LocalDate starttime; and private LocalDate endtime; and i have also private boolean finished =Boolean.FALSE; i want to write method or code (with validations) that when group is registered its starttime must start from that exact day or 1 months after, and its endtime must be after 3 or 6 month later and when endtime comes it should become finished(in db) help
Related
My entity has createdAt field which is filled by #CreatedDate when the entity is created. This property is of Date type.
class MyEntity {
#CreatedDate
private Date createdAt;
}
I would like to filter out all entities in a List that are in a range from startDate to endDate. The problem is that when I used findAllByCreatedAtBetween(Date startDate, Date endDate); it worked but not for all cases. When the entity is created i.e.: 2019-10-25 14:15:23 I would like to get it also when the user will type as #RequestParam startDate from 2019-10-24 00:00 endDate to 2019-10-25 14:15 and also take this entity. How could I ignore everything that is behind minutes? Is there a way, because when I pass those values as startDate and endDate the entity isn't found, to find it I have to change 14:15 to 14:16.
You can set any parameter without others in LocalDateTime. For example you want handle without minute. You can set your search date parameter like this:
LocalDateTime localDateTime= myDate.atTime(14,15);//The first parameter is for Hour and other one is for minute.
You can find more detail here: Java Time LocalDateTime At Time Functions
I have a Model, called Survey that has a
#CreationTimestamp
#Temporal(TemporalType.TIMESTAMP)
private Date submittedDate;
field, which is a timestamp that shows the time that a row is insterted in this table.
What I want to be able to query and show is this :
The total number of rows for every month, 12 months.
And then find the average. Which would be :
(countJan+CountFeb+...)/12; ( cycle through countInEveryMonth, and divide by 12 )
How do I query this using Spring Data Jpa ?
Do I write a method like :
int countBySubmittedDate(Date submittedDate) ? -
but this will count the number of Surveys at a given timestamp?
Thank you.
Whole year average can be:
public interface SurveyRepository extends CrudRepository<Survey, Integer> {
#Query("SELECT COUNT(s) FROM Survey s WHERE (date_field BETWEEN :yearStart AND :yearEnd)")
Long yearAverage(#Param("yearStart") Date yearEnd, #Param("yearEnd") Date yearEnd);
//you may divide it by 12
}
Same can be done for other scenario.
With Joda library, you can do
DateTimeFormat.forPattern("yyyy").parseLocalDate("2008")
that creates a LocalDate at Jan 1st, 2008
With Java8, you can try to do
LocalDate.parse("2008",DateTimeFormatter.ofPattern("yyyy"))
but that fails to parse:
Text '2008' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2008},ISO of type java.time.format.Parsed
Is there any alternative, instead of specifically writing sth like
LocalDate.ofYearDay(Integer.valueOf("2008"), 1)
?
LocalDate parsing requires that all of the year, month and day are specfied.
You can specify default values for the month and day by using a DateTimeFormatterBuilder and using the parseDefaulting methods:
DateTimeFormatter format = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.toFormatter();
LocalDate.parse("2008", format);
String yearStr = "2008";
Year year = Year.parse(yearStr);
System.out.println(year);
Output:
2008
If what you need is a way to represent a year, then LocalDate is not the correct class for your purpose. java.time includes a Year class exactly for you. Note that we don’t even need an explicit formatter since obviously your year string is in the default format for a year. And if at a later point you want to convert, that’s easy too. To convert into the first day of the year, like Joda-Time would have given you:
LocalDate date = year.atDay(1);
System.out.println(date);
2008-01-01
In case you find the following more readable, use that instead:
LocalDate date = year.atMonth(Month.JANUARY).atDay(1);
The result is the same.
If you do need a LocalDate from the outset, greg449’s answer is correct and the one that you should use.
I didn't get you
but from the title I think you want to parse a String to a localdate so this is how you do it
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
String date = "16/08/2016";
//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);
I tried like below, but in both the cases it is showing same time? What i am doing wrong.
LocalDateTime currentTime = LocalDateTime.now(ZoneId.of("UTC"));
Instant instant = currentTime.toInstant(ZoneOffset.UTC);
Date currentDate = Date.from(instant);
System.out.println("Current Date = " + currentDate);
currentTime.plusHours(12);
Instant instant2 = currentTime.toInstant(ZoneOffset.UTC);
Date expiryDate = Date.from(instant2);
System.out.println("After 12 Hours = " + expiryDate);
"Current Date" Time is showing Same as "After 12 Hours"...
The documentation of LocalDateTime specifies the instance of LocalDateTime is immutable, for example plusHours
public LocalDateTime plusHours(long hours)
Returns a copy of this LocalDateTime with the specified number of
hours added.
This instance is immutable and unaffected by this method call.
Parameters:
hours - the hours to add, may be negative
Returns:
a LocalDateTime based on this date-time with the hours added, not null
Throws:
DateTimeException - if the result exceeds the supported date range
So, you create a new instance of LocalDateTime when you execute plus operation, you need to assign this value as follows:
LocalDateTime nextTime = currentTime.plusHours(12);
Instant instant2 = nextTime.toInstant(ZoneOffset.UTC);
Date expiryDate = Date.from(instant2);
System.out.println("After 12 Hours = " + expiryDate);
I hope it can be helpful for you.
From the java.time package Javadoc (emphasis mine):
The classes defined here represent the principal date-time concepts,
including instants, durations, dates, times, time-zones and periods.
They are based on the ISO calendar system, which is the de facto world
calendar following the proleptic Gregorian rules. All the classes are
immutable and thread-safe.
Since every class in the java.time package is immutable, you need to capture the result:
LocalDateTime after = currentTime.plusHours(12);
...
This is simple, you can use
LocalDateTime's method "plusHours(numberOfHours)
Like This
localDateTime.plusHours(numberOfHours);
From a java.util.Date( a timestamp), how can I get the hour of day?
In joda.time I use getHourOfDay().
There are multiple solutions for this. If you wish to use the Java 8 classes from java.time the following you need to covert a Date to one of the DateTime classes. The following can be used to convert a Date to a ZonedDateTime where you then can get the hour:
Date date = new Date();
// Convert to java 8 ZonedDateTime
Date date = new Date();
final ZonedDateTime dateTime = date.toInstant()
.atZone(ZoneId.systemDefault());
// Get the hour
int hour = dateTime.getHour();
Quite verbose as you have noticed but the simple reason for this is that a Date is sort of an Instant
Despite its name, java.util.Date represents an instant on the time-line, not a "date". The actual data stored within the object is a long count of milliseconds since 1970-01-01T00:00Z (midnight at the start of 1970 GMT/UTC).
Another approach is simply to get the field from a Calendar instance.
final Calendar instance = Calendar.getInstance();
instance.setTime(date);
final int hourOfDay = instance.get(Calendar.HOUR_OF_DAY);