日期格式无效

时间:2014-08-13 13:38:34

标签: java date liferay java-7

我正在尝试将字符串转换为日期,我希望该日期采用此格式' yyyy-MM-d HH:mm:ss'我没有如何在字符串中获取此格式我的问题是我想以上述格式获取日期而不是字符串,但是'日期'?

我正在这样做

for(int k=0;k<12;k++)//for the months
{
     //i have added if condtion for the months with 31 and 30 and 28 days
    Calendar dateFromCal = Calendar.getInstance();
    dateFromCal.setTime(date);
    dateFromCal.set(year, k, 1, 0, 0, 0);

    Calendar dateToCal = Calendar.getInstance();
    dateToCal.setTime(date);
    dateToCal.set(year, k, 31, 23, 59, 59);

    //i have set the date format as 'yyyy:MM:dd HH:mm:ss'  
    dateFrom = dateFormat.format(dateFromCal.getTime());
    dateTo = dateFormat.format(dateToCal.getTime());

    fromdate = (Date)dateFormat.parse(dateFrom);
    todate = (Date)dateFormat.parse(dateTo);

}       

通过使用上面的代码我得到以下格式的日期

Sat Nov 01 00:00:00 GMT 2014

但我希望日期格式为

2014-11-01 00:00:00

注意:我希望此结果为日期而不是字符串

请给我解决方案 感谢....

4 个答案:

答案 0 :(得分:6)

  

我希望以上格式获取日期不是字符串而是'日期'?

您要求使用特定格式的Date - 就像说“我想要一个十六进制格式的int”。 Date不会拥有格式 - 它只是一个瞬间。它不知道日历系统或时区 - 它是仅仅自Unix时代以来的毫秒数。如果你想要一个格式化的值,那就是一个字符串。

您可能应该保持Date不变,并在以后格式化,更接近用户界面。

答案 1 :(得分:0)

我遇到了一个期望特定格式的API(javax.xml.datatype.XMLGregorianCalendar)。就我而言,我在java 7

的帮助下解决了这个问题

my_date.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

通过这样做,您可以使用00:00:00获取最终结果。

答案 2 :(得分:0)

这是一个简单的方法,负责从String到Date的格式化:

                                                                                                                                 ` see code below:        
    public XMLGregorianCalendar formatToGregorianDate(String myDate) {
    //actual Date format should be "dd-MMM-yy", but SimpleDateFormat accepts only this one
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;

    try {
        //Date is accepted only without time or zone
        date = simpleDateFormat.parse(myDate.substring(0, 10));
    } catch (ParseException e) {
        System.out.println("Date can't be parsed to required format!");
        e.printStackTrace();
    }

    GregorianCalendar gregorianCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
    gregorianCalendar.setTime(date);
    XMLGregorianCalendar result = null;
    try {
        result = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
        //date must be sent without time
        result.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
    } catch (DatatypeConfigurationException e) {
        System.out.println("XMLGregorianCalendar can't parse the Date format!");
        e.printStackTrace();
    }

    return result;
}`

也许你只需要根据自己的需要进行调整,我不知道你需要什么 仅供参考 - 请注意我使用的是java.util.Date。也许有更好的逻辑,但这个肯定是有效的。

希望它有所帮助。

答案 3 :(得分:0)

<块引用>

注意:我希望这个结果是日期而不是字符串

简短回答:这是不可能的。

详情:

java.util.Date 对象仅表示时间轴上的一个瞬间 — 自 UNIX 时代(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来毫秒数的包装器。由于它不保存任何时区信息,它的 toString 函数应用 JVM 的时区返回一个 String 格式,EEE MMM dd HH:mm:ss zzz yyyy,从这个 毫秒值。要以不同的格式和时区获取 String 对象的 java.util.Date 表示,您需要将 SimpleDateFormat 与所需的格式和适用的时区一起使用,例如

Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);

sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String strDateNewYork = sdf.format(date);

sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String strDateUtc = sdf.format(date);

事实上,没有一个标准的日期时间类具有保存格式信息的属性。即使某些库或自定义类承诺这样做,它也违反了 Single Responsibility Principle。 Date-Time 对象应该存储有关日期、时间、时区等的信息,与格式无关。以所需格式表示日期时间对象的唯一方法是使用日期时间解析/格式化类型将其格式化为 String

  • 对于现代日期时间 APIjava.time.format.DateTimeFormatter
  • 对于旧的 Date-Time APIjava.text.SimpleDateFormat

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

另外,下面引用的是来自 home page of Joda-Time 的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用 java.time(现代日期时间 API)的解决方案:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        int year = 2021;
        int month = 6;
        int hour = 23;
        int minute = 59;
        int second = 59;
        
        LocalDateTime ldt = LocalDate.of(year, month, 1)
                            .with(TemporalAdjusters.lastDayOfMonth())
                            .atTime(LocalTime.of(hour, minute, second));

        // Default format i.e. ldt#toString
        System.out.println(ldt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ENGLISH);
        String formatted = dtf.format(ldt);
        System.out.println(formatted);
    }
}

输出:

2021-06-30T23:59:59
2021-06-30 23:59:59

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project