将长字符串转换为日期

3

我从数据库中获取的日期数值为 long 值。我将其转换为 string 以使用 parse 函数。以下是我的代码:

 Date date1 = new SimpleDateFormat("MM/dd/yyyy").parse(strDate1);

但是当执行这段代码时,应用程序会崩溃。如果在执行之前使用了 null 检查,它将能够成功地执行。
strDate1="12/30/2012".

但是我得到的值是 "12302012235"(伪值)。

我该怎么办?

编辑:

我将日期值保存为整数到数据库中。从数据库中获取此值并将其转换为字符串。这就是实际的 strDate1 值。

strDate1="1346524199000"

3
你的 long 值究竟代表什么?它储存了什么,由谁储存?如果它是指类似于“自 Unix 纪元以来的毫秒数”这样的含义,或者某种可怕的伪文本数值表示法,那将会有很大的区别。 - Jon Skeet
你能否只是去掉最后三个字符,然后使用你的值? - Aviral
7个回答

5
尝试以下代码段:

        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(Long.parseLong(val));         
        Date d = (Date) c.getTime();        
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");       
        String time = format.format(d);//this variable time contains the time in the format of "day/month/year".    

2

Java 8, 将毫秒数(long类型)按照指定的日期格式转为字符串。如果你有一个长整型的毫秒数,想将其转换为指定时区和日期格式的日期字符串,可以使用如下方法:

dateInMs 是一个代表日期时间的 long 值。

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                    .format(Instant.ofEpochMilli(dateInMs).atZone(ZoneId.of("Europe/London")))

2

请尝试这个:

SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
    Date dateD=new Date();
    dateD.setTime(LongTime);
    date=dateFormat.format(dateD);

2

java.time

Java的java.util日期时间API和其格式化API SimpleDateFormat已经过时且容易出错。建议完全停止使用它们并转换为现代日期时间API*

使用现代日期时间API:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        long input = 12302012235L;

        // Get Instant from input
        Instant instant = Instant.ofEpochMilli(input);
        System.out.println(instant);

        // Convert Instant to ZonedDateTime by applying time-zone
        // Change ZoneId as applicable e.g. ZoneId.of("Asia/Dubai")
        ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
        System.out.println(zdt);

        // Format ZonedDateTime as desired
        // Check https://stackoverflow.com/a/65928023/10819573 to learn more about 'u'
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
        String formatted = dtf.format(zdt);
        System.out.println(formatted);

        // If at all, you need java.util.Date
        Date date = Date.from(instant);
    }
}

输出:

1970-05-23T09:13:32.235Z
1970-05-23T10:13:32.235+01:00[Europe/London]
05/23/1970

了解更多关于现代日期时间API的信息,请查看教程:日期时间


* 如果由于任何原因,您必须坚持使用Java 6或Java 7,则可以使用ThreeTen-Backport将大部分java.time功能回溯到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请查看通过去糖化可用的Java 8+ API以及如何在Android项目中使用ThreeTenABP


1
你可以尝试以下代码:
private Date getGMTDate(long date) {
    SimpleDateFormat dateFormatGmt = new SimpleDateFormat(
            "yyyy-MMM-dd HH:mm:ss");
    dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    SimpleDateFormat dateFormatLocal = new SimpleDateFormat(
            "yyyy-MMM-dd HH:mm:ss");

    Date temp = new Date(date);

    try {
        return dateFormatLocal.parse(dateFormatGmt.format(temp));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return temp;
}  

希望这能对您有所帮助。


0

试试这个

Date date1 = new SimpleDateFormat("MMddyyyySSS").parse(strDate1);

希望它适用于12302012235,但我假设235是毫秒。


0

我已经得到了答案。实际上,我想将字符串转换为日期仅用于比较值。由于我获取的值是long类型,所以我直接使用compareTo函数来完成这个操作,避免了将long类型转换为字符串和字符串转换为日期的过程。感谢大家的支持。


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