【问题标题】:Cant fetch current time, date showing year as 1970无法获取当前时间,日期显示年份为 1970
【发布时间】:2013-11-18 12:43:36
【问题描述】:
public static final String inputFormat = "HH:mm";

private Date date;
private Date dateCompareOne;
private Date dateCompareTwo;

LINE 5: 
private String compareStringOne =  String.valueOf(SetTimeActivity.intFromTimeH)+ ":"+ String.valueOf(SetTimeActivity.intFromTimeM) ;

LINE 6:
private String compareStringTwo = String.valueOf(SetTimeActivity.intToTimeH) + ":"+ String.valueOf(SetTimeActivity.intToTimeM);

SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
private void compareDates()
{
Calendar now = Calendar.getInstance();

int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);

date = parseDate(hour + ":" + minute);
dateCompareOne = parseDate(compareStringOne);
dateCompareTwo = parseDate(compareStringTwo);


        if (!(dateCompareOne.before( date ) && dateCompareTwo.after(date))) {
 ....

我正在尝试检查当前时间是否在指定时间之间。为此,我首先将指定时间转换为字符串(在 Line5 和 Line6 中)。即使我得到正确的整数值,形成的字符串总是显示“0:0”。 此外,年份显示为 1970 年(显示的日期和日期也是错误的)。 我需要获取当前时间。我做错了什么?

    private Date parseDate(String date) {

    try {
        return inputParser.parse(date);
    } catch (java.text.ParseException e) {
        return new Date(0);
    }
}

【问题讨论】:

  • 确保日期和时间设置正确。为了让生活更轻松,请查看以下库。 joda.org/joda-time也许这可以帮助你让事情变得更容易

标签: android datetime time


【解决方案1】:

parseDate() 函数返回自 1970 年 1 月 1 日以来经过的时间。这被称为 Unix 纪元,它是所有时间在 Unix 计算机中的表示方式。通过对仅包含小时和分钟的字符串运行 parseDate 函数,您将创建一个 Date 对象,该对象表示 1970 年 1 月 1 日之后的时间 HH:mm。

您的代码使用了一种非常奇怪的方式来获取当前时间。将 Calendar 转换为两个整数,然后转换为字符串,最后再解析回 Date 会效率低下,并且会导致各种不必要的错误。

当您初始化一个新的 Date 对象时,它会自动分配初始化时间。因此:

Date d = new Date();

将导致 d 成为初始化时刻(即今年、月、日、小时、分钟、秒和微秒)。然后你可以只使用 Date.after() 和 Date.before()。

如果您仍想通过 Calendar 方法执行此操作,那么最好通过以下方式为您服务:

cal = Calendar.getInstance();    
Date d = cal.getTime();

您可能还有其他问题,但值得先正确处理。当您通过将数据编写为字符串来传递数据时(尤其是当它与时间相关时,对于“12”实际代表的含义存在各种歧义),您将失去语言输入给您带来的所有优势。

【讨论】:

  • 我只需要将指定时间与当前时间进行比较,我更喜欢日历方式。您建议对我的代码进行哪些更改?
  • 最简单的更改如下: Date date = new Date(); dateCompareOne = parseDate(compareStringOne); dateCompareTwo = parseDate(compareStringTwo); ...(为格式化道歉)
  • 但我在 compareStringOne 和 compareStringTwo 中没有得到正确的日期。这就是我的问题。
  • 你读过DateUtils.parseDate documentation?它需要一个包含字符串模式的字符串来解析。我不认为你正在接近它的正确方式。为什么要将表示小时和分钟的整数转换为字符串,然后再解析回 Date 对象?为什么不直接创建一个 Calender 对象并从 SetTimeActivity 设置小时和分钟?不需要字符串或解析。
  • 我必须这样做,因为我在指定时间(用户输入)内只得到整数。
【解决方案2】:

这段代码可以帮助你

        final Calendar c = Calendar.getInstance();       
    int  hour = c.get(Calendar.HOUR_OF_DAY);
   int minute = c.get(Calendar.MINUTE);        if (c.get(Calendar.AM_PM) == Calendar.AM)
     am_pm = "AM";
        else if (c.get(Calendar.AM_PM) == Calendar.PM) 
            am_pm = "PM"; 

       // Calendar c = Calendar.getInstance();   

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
        String formattedDate = df.format(c.getTime());        
        Toast.makeText(this, formattedDate, Toast.LENGTH_SHORT).show();

【讨论】:

    【解决方案3】:

    如果您已经使用Date 对象,为什么不使用Date.after(...)Date.before(...) 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2020-11-23
      • 2018-08-10
      • 1970-01-01
      • 2016-03-29
      • 2020-04-04
      相关资源
      最近更新 更多