Удалить время из объекта Date? - PullRequest
61 голосов
/ 22 марта 2012

Я хочу удалить время из Date объекта.

DateFormat df;
String date;
df = new SimpleDateFormat("dd/MM/yyyy");
d = eventList.get(0).getStartDate(); // I'm getting the date using this method
date = df.format(d); // Converting date in "dd/MM/yyyy" format

Но когда я конвертирую эту дату (в формате String), это также время добавления.

Я вообще не хочу времени. То, что я хочу, это просто "21/03/2012".

Ответы [ 19 ]

108 голосов
/ 26 апреля 2012

Вы можете удалить часть времени из java.util.Date, установив нулевые значения часов, минут, секунд и миллисекунд.

import java.util.Calendar;
import java.util.Date;

public class DateUtil {

    public static Date removeTime(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

}
43 голосов
/ 22 марта 2012

Быстрый ответ:

Нет, вам не разрешено это делать. Поскольку это то, для чего Date используется.

Из javadoc of Date:

Класс Date представляет определенный момент времени с точностью до миллисекунды.

Однако , поскольку этот класс является просто даннымиобъект.Это не важно, как мы это описываем.Когда мы видим дату 2012/01/01 12:05:10.321, мы можем сказать, что это 2012/01/01, это то, что вам нужно.Есть много способов сделать это.

Пример 1: манипулирование строкой

Входная строка: 2012/01/20 12: 05: 10.321

Желаемая строка вывода: 2012/01/20

Поскольку yyyy / MM / dd - это именно то, что нам нужно, мы можем просто манипулировать строкой, чтобы получить результат.

String input = "2012/01/20 12:05:10.321";
String output = input.substring(0, 10);  // Output : 2012/01/20

Пример 2: по SimpleDateFormat

Строка ввода: 2012/01/20 12: 05: 10,321

Желаемая строка вывода: 01/20/2012

В этом случае нам нужен другой формат.

String input = "2012/01/20 12:05:10.321";
DateFormat inputFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = inputFormatter.parse(input);

DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
String output = outputFormatter.format(date); // Output : 01/20/2012

Для использования SimpleDateFormat установите флажок SimpleDateFormat JavaDoc .

29 голосов
/ 26 апреля 2013

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

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils также содержит множество других полезных утилит, таких как "isSameDay ()" и тому подобное.Проверьте это!Это может облегчить вам жизнь.

12 голосов
/ 17 января 2014

Что по этому поводу:

    Date today = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    today = sdf.parse(sdf.format(today));
8 голосов
/ 22 марта 2012

То, что вы хотите, это невозможно .

Объект Date представляет «абсолютный» момент времени. Вы не можете "удалить часть времени" из него. Когда вы печатаете объект Date непосредственно с помощью System.out.println(date), он всегда будет отформатирован в формате по умолчанию, который включает время. Вы ничего не можете сделать, чтобы изменить это.

Вместо того, чтобы как-то пытаться использовать класс Date для чего-то, для чего он не предназначен, вы должны искать другое решение. Например, используйте SimpleDateFormat для форматирования даты в любом формате.

API даты и календаря Java, к сожалению, не являются наиболее хорошо разработанными классами стандартного API Java. Есть библиотека под названием Joda-Time , которая имеет гораздо лучший и более мощный API.

Joda-Time имеет ряд специальных классов для поддержки дат, времени, периодов, длительностей и т. Д. Если вы хотите работать только с датой без времени, то Joda-Time LocalDate класс будет тем, что вы будете использовать.

4 голосов
/ 06 марта 2015

Возможно, приведенный ниже код может помочь людям, которые ищут ноль. Час дня:

    Date todayDate = new Date();
    GregorianCalendar todayDate_G = new GregorianCalendar();
    gcd.setTime(currentDate);
    int _Day    = todayDate_GC.get(GregorianCalendar.DAY_OF_MONTH);
    int _Month  = todayDate_GC.get(GregorianCalendar.MONTH);
    int _Year   = todayDate_GC.get(GregorianCalendar.YEAR);

    GregorianCalendar newDate = new GregorianCalendar(_Year,_Month,_Day,0,0,0);
    zeroHourDate = newDate.getTime();
    long zeroHourDateTime = newDate.getTimeInMillis();

Надеюсь, это будет полезно.

3 голосов
/ 25 сентября 2012

вы можете попробовать что-то вроде этого:

import java.text.*;
import java.util.*;
public class DtTime {
public static void main(String args[]) {
String s;
Format formatter;
  Date date = new Date();
  formatter = new SimpleDateFormat("dd/MM/yyyy");
  s = formatter.format(date);
  System.out.println(s);
    }
}

Это даст вам вывод как 21/03/2012

Или вы можете попробовать это, если вы хотите вывод как 21 Mar, 2012

import java.text.*;
import java.util.*;
public class DtTime {
public static void main(String args[]) {
    Date date=new Date();
String df=DateFormat.getDateInstance().format(date);
System.out.println(df);
    }
}
3 голосов
/ 26 февраля 2015

Вы можете написать это, например:

private Date TruncarFecha(Date fechaParametro) throws ParseException {
    String fecha="";
    DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
    fecha =outputFormatter.format(fechaParametro);
    return outputFormatter.parse(fecha);
}
2 голосов
/ 22 марта 2012
Date dateWithoutTime =
    new Date(myDate.getYear(),myDate.getMonth(),myDate.getDate()) 

Это устарело, но самый быстрый способ сделать это.

1 голос
/ 22 марта 2012

java.util.Date представляет дату / время с точностью до миллисекунд. У вас нет выбора, кроме как включить время с ним. Вы можете попытаться обнулить время, но тогда в игру вступят часовые пояса и переход на летнее время - и это может испортить ситуацию (e.g. 21/03/2012 0:00 GMT is 20/03/2012 PDT).

Вам может потребоваться java.sql.Date для представления только части даты (хотя внутри все еще используется мс).

...