Pues yo usaría Stringtokenizer para separar hora y fecha:
StringTokenizer st = new StringTokenizer("1899-12-31 18:20:15 ");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
Daría esto:
1899-12-31
18:20:15
Luego lo usaría de nuevo para separar horas minutos y segundos:
StringTokenizer st = new StringTokenizer("18:20:15 ", ":");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
Daría esto:
18
20
15
Tú en vez de imprimirlo por pantalla puedes guardarlo en variables.
Para pasar las horas a formato pm/am: comprueba si la hora es mayor de que 12, si es así le pones el pm y le haces el módulo de 12. Si es que no, pues le pones el am.
Para darle formato a la fecha puedes usar SimpleDateFormat como se explica
aquí.
Saludos.