我该如何从我的日历中获取日期?

26

我有一个包含个人出生日期的Map,其值为GregorianCalendar类型。

例如:

{
    motherEmailID=null,
    coreType=Ticket,
    _NULL=null,
    additionalFaclitiesProvided=[],
    dateOfBirth=java.util.GregorianCalendar[
        time=585340200000,
        areFieldsSet=false,
        areAllFieldsSet=false,
        lenient=true,
        zone=sun.util.calendar.ZoneInfo[id="GMT",
    offset=0,
    dstSavings=0,
    useDaylight=false,
    transitions=0,
    lastRule=null],
        firstDayOfWeek=1,
        minimalDaysInFirstWeek=1,
        ERA=1,
        YEAR=1988,
        MONTH=6,
        WEEK_OF_YEAR=30,
        WEEK_OF_MONTH=4,
        DAY_OF_MONTH=20,
        DAY_OF_YEAR=202,
        DAY_OF_WEEK=4,
        DAY_OF_WEEK_IN_MONTH=3,
        AM_PM=0,
        HOUR=0,
        HOUR_OF_DAY=0,
        MINUTE=0,
        SECOND=0,
        MILLISECOND=0,
        ZONE_OFFSET=19800000,
        DST_OFFSET=0],
    targetEnd=null,
    year_semester=null
}
我需要一个Date,但是我的数据库中它仅以Calendar格式存在。数据库列的数据类型为DateTime。如何以Date格式获取出生日期?

1
请为了可读性格式化您的代码,您可以使用CODE标签或在它们周围使用`字符。 - Yanick Rochon
格式化以使其可读,并请发布代码。int main() { printf("Hello, World!"); return 0; } 这是一个简单的C程序,它将打印出“Hello, World!”的消息。 - jmj
3个回答

42
Calendar calendar  = ( Calendar )  thatMap.get("dateOfBirth");
Date date = calendar.getTime();

这里有一个示例可供您使用,以测试它是否符合您的需求。

import java.util.*;
import java.text.*;

public class GetDate {
     public static void main( String [] args ) {
        Map map = new HashMap();
        map.put("dateOfBirth", Calendar.getInstance() );
        map.put("additionalFaclitiesProvided", new ArrayList() );
        /// etc. 
        System.out.println( map );

        Calendar cal = ( Calendar ) map.get("dateOfBirth");
        Date date = cal.getTime();
        // Addressing your comment:
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        System.out.println( "The date is: "+  sdf.format( date )  );
    }
}

输出:

java GetDate 
    {dateOfBirth=java.util.GregorianCalendar[
        time=1282824447050,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[
            id="America/Mexico_City",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=99,lastRule=java.util.SimpleTimeZone[
                id=America/Mexico_City,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=3,startDay=1,
                startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=0
            ]
        ],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=4,DAY_OF_MONTH=26,DAY_OF_YEAR=238,DAY_OF_WEEK=5,
            DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=7,HOUR_OF_DAY=7,MINUTE=7,SECOND=27,MILLISECOND=50,ZONE_OFFSET=-21600000,DST_OFFSET=3600000]**, additionalFaclitiesProvided=[]
    }

日期是:26.08.2010


我认为强制类型转换是不必要的,因为GregorianCalendar继承了Calendar - Eric Wilson
1
@FarmBoy,是的,但是定义的映射返回“Object”,所以需要进行转换。 - OscarRyz
非常感谢。我明白了。 我得到了你指定的格式(Thu Aug 26 07:07:27 CDT 2010)。但是我需要像这样的日期格式:26.08.2010。有没有预定义的函数可以得到这样的格式?我该如何得到这样的日期格式? - Twity
@Twity,为此创建一个新问题。这也会帮助其他人。顺便说一句,这很容易(提示:Google SimpleDateFormat)。编辑我已经添加了答案的格式部分。请记住,您拥有的是具有指定格式的字符串,而不是最初想要的日期对象。 - OscarRyz
谢谢兄弟,你救了我的一天 :) :) :) - Khalil Bz

6

java.sql.Date 转换为 java.util.Calendar(或 java.util.GregorianCalendar

Calendar cal = new GregorianCalendar();
cal.setTime(date);   // java.sql.Date date;

// then set the GregorianCalendar in your map
map.put('dateOfBirth', cal);

From java.util.Calendar to java.sql.Date

java.sql.Date date = new java.sql.Date(map.get('dateOfBirth').getTimeInMillis());

** 注意 **

java.sql.Timestampjava.sql.Date 的兄弟类,两者都继承自 java.util.Date,因此您可以以完全相同的方式使用它们。

此外,要将日期字符串转换为日期对象,请使用 SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
Date d = sdf.parse("2010-08-26 8:34:00");
Calendar cal = Calendar.getInstance();
cal.setTime(d);

并将其反转
String dateStr1 = sdf.format(cal.getTime());
// or
String dateStr2 = sdf.format(date);  // java.sql.Date / java.util.Date

1

复制并运行示例。

只需更改模式以测试不同的开关条件。

为了封装,只需将几个方法设置为私有。日期格式化不是您的工作,因为方法现在返回日期,由调用方使用任何格式。

import java.util.Date;
import java.util.GregorianCalendar;

public class RandomDateOfBirthGenerator {

    private static GregorianCalendar gc = new GregorianCalendar();

    public static enum Mode {
        SENIOR, ADULT, YOUTH, CHILD
    }

    public static Date generateRandomDateOfBirth(Mode mode) {

        int year = 0;

        switch(mode){
        case SENIOR:
            year = randBetween(1900, 1940);
            break;

        case ADULT:
            year = randBetween(1941, 1995);
            break;

        case YOUTH:
            year = randBetween(1995, 2002);
            break;

        case CHILD:
            year = randBetween(2002, 2014);
            break;
        }

        gc.set(gc.YEAR, year);

        int dayOfYear = randBetween(1, gc.getActualMaximum(gc.DAY_OF_YEAR));

        gc.set(gc.DAY_OF_YEAR, dayOfYear);

        return gc.getTime();
    }

    private static int randBetween(int start, int end) {
        return start + (int) Math.round(Math.random() * (end - start));
    }

    public static void main(String[] args) {
        System.out.println(generateRandomDateOfBirth(Mode.CHILD));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接