/*
fEMR - fast Electronic Medical Records
Copyright (C) 2014 Team fEMR
fEMR is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
fEMR is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with fEMR. If not, see <http://www.gnu.org/licenses/>. If
you have any questions, contact <info@teamfemr.org>.
*/
package femr.util.calculations;
import femr.common.models.PatientEncounterItem;
import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import play.Logger;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* This class contains utilities for manipulating dates. If you add something here, please clearly document the
* format of both the input and output.
*/
public class dateUtils {
public static int calculateYears(Date age) {
LocalDate birthdate = new LocalDate(age);
LocalDate now = new LocalDate();
Years years = Years.yearsBetween(birthdate, now);
return years.getYears();
}
public static String getCurrentDateTimeString(){
DateTimeFormatter dateFormat = DateTimeFormat
.forPattern("yyyy/mm/dd HH:mm:ss");
LocalDateTime localDateTime = new LocalDateTime();
dateFormat.print(localDateTime);
String dt = localDateTime.toString();
return dt;
}
public static DateTime getCurrentDateTime(){
return new DateTime();
}
/**
* Gets the integer age of a patient, then appends "YO" or "MO"
* depending on if the patient age is in years(adult) or months(baby)
*
* @param born the birthdate of the patient
* @return a string with the patient's age
*/
public static String getAge(Date born) {
LocalDate birthdate = new LocalDate(born);
LocalDate now = new LocalDate();
Months months = Months.monthsBetween(birthdate, now);
int monthsInt = months.getMonths();
if (monthsInt < 24)
return Integer.toString(monthsInt) + " MO";
else
return Integer.toString(monthsInt/12) + " YO";
}
/**
* Gets the patient's age in years. If the patient is an infant with less than 12 years of life,
* 0 will be returned.
*
* @param born the birthdate of the patient
* @return an Integer that represents the number of years the patient has been alive. Returns null
* if an error occured OR if the patient does not have an age (just an age classification).
*/
public static Integer getYearsInteger(Date born) {
if (born == null){
return null;
}
LocalDate birthdate = new LocalDate(born);
LocalDate now = new LocalDate();
Integer age = 0;
Months months = Months.monthsBetween(birthdate, now);
int monthsInt = months.getMonths();
if (monthsInt >= 12) {
double temp = Math.floor(monthsInt / 12);
try {
age = (int) Math.round(temp);
} catch (Exception ex) {
age = null;
Logger.error("a patient's age could not be handled as an int");
}
}
return age;
}
/**
* Gets the patient's age in months.
*
* @param born the birthdate of the patient
* @return an Integer that represents the number of months the patient has been alive. Returns null
* if an error occured OR if the patient does not have an age (just an age classification).
*/
public static Integer getMonthsInteger(Date born) {
if (born == null){
return null;
}
LocalDate birthdate = new LocalDate(born);
LocalDate now = new LocalDate();
Months months = Months.monthsBetween(birthdate, now);
return months.getMonths();
}
public static float getAgeAsOfDateFloat(Date born, DateTime asOfDate) {
LocalDate birthdate = new LocalDate(born);
LocalDate currDate = new LocalDate(asOfDate);
Months months = Months.monthsBetween(birthdate, currDate);
int monthsInt = months.getMonths();
float result = (float) monthsInt;
return result/12;
}
/**
* Converts a DateTime object to a string
*
* @param dateTime the DateTime object to convert, not null
* @return A string in the format "mm yyyy" or null if dateTime is null
*/
public static String getFriendlyDateMonthYear(DateTime dateTime){
if (dateTime == null)
return null;
DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/yyyy");
String dateString = dateTime.toString(formatter);
return dateString;
}
public static String getFriendlyDate(DateTime dateTime){
if (dateTime == null)
return null;
DateTimeFormatter fmt = DateTimeFormat.forPattern("MMMM d, yyyy - HH:mm:ss");
String dtStr = dateTime.toString(fmt);
return dtStr;
}
/**
* Takes a date object and formats it into a user friendly string
*
* Format: (MM/dd/yyyy)
* Format: (08/02/1989)
*
* @param date the date you would like to format, not null
* @return the sexy looking date string or null if errors
*/
public static String getFriendlyDate(Date date){
if (date == null)
return null;
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String dStr = df.format(date);
return dStr;
}
/**
* Takes a date object and formats it into a user friendly string of which
* can be recognized internationally
*
* Format: (dd/MMMM/yyyy)
* Format: 02-Aug-1989
*
* @param date the date you would like to format, not null
* @return the sexy looking date string or null if errors
*/
public static String getFriendlyInternationalDate(Date date){
if (date == null)
return null;
DateFormat df = new SimpleDateFormat("dd/MMMM/yyyy");
String dStr = df.format(date);
return dStr;
}
/**
* Takes a String and composed of the date and time and converts
* to a string of just the time
* Return Format: (HH:MM:SS)
*
*
* @param String of the complete date and time
* @return String of just the time or " " if string is null
*/
public static String getDisplayTime(String completeTime)
{
String time;
if(completeTime!=null) {
String[] parts = completeTime.split("-");
time = parts[1];
return time;
}
else
return " ";
}
/**
* Takes a PatientEncounter Time and returns
* a string of just the turn around time (time elasped between the Triage Check in
* and Pharmacy Check out
* Return Format: (HH:MM:SS)
*
*
* @param item the patient encounter item
* @return String of just the time or " " if string is null
*/
public static String getTurnAroundTime(PatientEncounterItem item){
String time=" ";
if(item.getPharmacyDateOfVisit()!= null &&item.getTriageDateOfVisit()!=null) {
SimpleDateFormat ft = new SimpleDateFormat("HH:mm:ss");
try {
Date td,pd;
td = ft.parse(getDisplayTime(item.getTriageDateOfVisit()));
pd= ft.parse(getDisplayTime(item.getPharmacyDateOfVisit()));
long diff = pd.getTime() - td.getTime();
String ss = String.valueOf(diff / 1000 % 60);
String sm = String.valueOf(diff / (60 * 1000) % 60);
String sh = String.valueOf(diff / (60 * 60 * 1000));
time="Hours: "+sh+" Minutes: " +sm+" Seconds: "+ss;
}catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
return time;
}
else {
return time;
}
}
}