Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 还有几天_Java_Android_Time - Fatal编程技术网

Java 还有几天

Java 还有几天,java,android,time,Java,Android,Time,我需要从一个日期到第二个日期进行倒计时 e、 g 当前日期:2013年3月1日下一个日期:2013年1月21日 然后显示::17天剩余时间 我实现了这样的代码 String inputDateString = "01/22/2013"; Calendar calCurr = Calendar.getInstance(); Calendar calNext = Calendar.getInstance(); calNext.setTime(new Date(inputDateString));

我需要从一个日期到第二个日期进行倒计时

e、 g

当前日期:2013年3月1日
下一个日期:2013年1月21日

然后显示::
17天剩余时间

我实现了这样的代码

String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar calNext = Calendar.getInstance();
calNext.setTime(new Date(inputDateString)); 

if(calNext.after(calCurr)) 
{
    long timeDiff = calNext.getTimeInMillis() - calCurr.getTimeInMillis();
    int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
    dni.setText("Days Left: "+daysLeft);
}
else
{
    long timeDiff = calCurr.getTimeInMillis() - calNext.getTimeInMillis();
    timeDiff = DateUtils.YEAR_IN_MILLIS - timeDiff;
    int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
}

有没有更好的方法来实现这些目标?

有几个库可以将日期转换为
n天
格式:


使用日历的方法:

String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar day = Calendar.getInstance();
day.setTime(new SimpleDateFormat("MM/dd/yyyy").parse(inputDateString));
if(day.after(calCurr)){
               System.out.println("Days Left: " + (day.get(Calendar.DAY_OF_MONTH) -(calCurr.get(Calendar.DAY_OF_MONTH))) );
}
产出:剩余天数:17

要将年份增加1,可以使用Calendar.add()方法

我使用这个类

import android.text.format.DateUtils;

import java.util.Date;

import static android.text.format.DateUtils.FORMAT_NUMERIC_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_YEAR;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;

/**
 * Utilities for dealing with dates and times
 */
public class TimeUtils {

    /**
     * Get relative time for date
     *
     * @param date
     * @return relative time
     */
    public static CharSequence getRelativeTime(final Date date) {
        long now = System.currentTimeMillis();
        if (Math.abs(now - date.getTime()) > 60000)
            return DateUtils.getRelativeTimeSpanString(date.getTime(), now,
                    MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR
                    | FORMAT_NUMERIC_DATE);
        else
            return "Just now";
    }
}
TimeUtils.getRelativeTime(日期)
返回类似于
刚才,
2分钟前,
2小时前,
2天前,

2013年11月4日

我在互联网上搜索了这段代码,但没有找到。虽然我回复得很晚,但这将是一段有用的代码

public static String getTimeLeft(String date) { // dateFormat = "yyyy-MM-dd"
    String[] DateSplit = date.split("-");
    int month = Integer.parseInt(DateSplit[1]) - 1, // if month is november  then subtract by 1
    year = Integer.parseInt(DateSplit[0]), day = Integer
            .parseInt(DateSplit[2]), hour = 0, minute = 0, second = 0;
    Calendar now = Calendar.getInstance();

    int sec = second - Calendar.getInstance().get(Calendar.SECOND), min = minute
            - Calendar.getInstance().get(Calendar.MINUTE), hr = hour
            - Calendar.getInstance().get(Calendar.HOUR_OF_DAY), dy = day
            - Calendar.getInstance().get(Calendar.DATE), mnth = month
            - Calendar.getInstance().get(Calendar.MONTH), daysinmnth = 32 - dy;

    Calendar end = Calendar.getInstance();

    end.set(year, month, day);

    if (mnth != 0) {
        if (dy != 0) {
            if (sec < 0) {
                sec = (sec + 60) % 60;
                min--;
            }
            if (min < 0) {
                min = (min + 60) % 60;
                hr--;
            }
            if (hr < 0) {
                hr = (hr + 24) % 24;
                dy--;
            }
            if (dy < 0) {
                dy = (dy + daysinmnth) % daysinmnth;
                mnth--;
            }
            if (mnth < 0) {
                mnth = (mnth + 12) % 12;
            }
        }
    }

    String hrtext = (hr == 1) ? "hour" : "hours", dytext = (dy == 1) ? "day"
            : "days", mnthtext = (mnth == 1) ? "month" : "months";

    if (now.after(end)) {
        return "";
    } else {
        String months = "", days = "", hours = "";
        months = (mnth > 0) ? mnth + " " + mnthtext : "";
        if (mnth <= 0) {
            days = (dy > 0) ? dy + " " + dytext : "";
            if (dy <= 0) {
                hours = (hr > 0) ? hr + " " + hrtext : "";
            }
        }
        //Log.d("DATE", months + " 1 " + days + " 2 " + hours);
        return months + days + hours;
    }
}
公共静态字符串getTimeLeft(字符串日期){//dateFormat=“yyyy-MM-dd” 字符串[]DateSplit=date.split(“-”); int month=Integer.parseInt(DateSplit[1])-1,//如果月份是11月,则减去1 year=Integer.parseInt(DateSplit[0]),day=Integer .parseInt(DateSplit[2]),小时=0,分钟=0,秒=0; Calendar now=Calendar.getInstance(); int sec=second-Calendar.getInstance().get(Calendar.second),min=min -Calendar.getInstance().get(Calendar.MINUTE),hr=hour -Calendar.getInstance().get(Calendar.HOUR\u OF_DAY),dy=DAY -Calendar.getInstance().get(Calendar.DATE),mnth=month -Calendar.getInstance().get(Calendar.MONTH),daysinmnth=32-dy; 日历结束=Calendar.getInstance(); 结束。设置(年、月、日); 如果(mnth!=0){ 如果(dy!=0){ 如果(秒<0){ 秒=(秒+60)%60; 闵--; } 如果(最小值<0){ 最小=(最小+60)%60; 人力资源--; } 如果(hr<0){ 心率=(心率+24)%24; dy--; } if(dy<0){ dy=(dy+daysinmnth)%daysinmnth; mnth--; } if(mnth<0){ mnth=(mnth+12)%12; } } } 字符串hrtext=(hr==1)?“小时”:“小时”,dytext=(dy==1)?“天” :“天”,mnthtext=(mnth==1)?“月”:“月”; 如果(现在,在(结束)之后){ 返回“”; }否则{ 字符串月份=”,天=”,小时=”; 月份=(mnth>0)?mnth+“”+mnth文本:“”; 如果(mnth 0)?dy+“”+dytext:“”; 如果(dy 0)?hr+“”+hr文本:“”; } } //日志d(“日期”,月份+“1”+天+“2”+小时); 返回月+天+小时; } }
其他答案忽略了时区,这可能是至关重要的,取决于您希望倒计时的准确性。如果未指定时区,则将获得的默认值为

众所周知,java.util.Date和.Calendar类非常麻烦。避开它们。在中使用或新的

2.3中的一段代码,未经测试(在我的脑海中)。搜索StackOverflow以获取更多示例

String input = "01/22/2013";
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );
DateTime future = formatterInput.parseDateTime( input );

DateTime now = new DateTime( timeZone );

int days = Days.daysBetween( now, future ).getDays();
Interval interval = new Interval( now, future );
Period period = new Period( interval );
对这些变量执行一些
System.out.println
调用,您会大吃一惊

您将看到的字符串格式是。您还可以创建其他格式。

tl;博士 java.time 现代方法使用java.time类

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

确定你的日期

LocalDate start = LocalDate.of( 2013 , Month.JANUARY , 3 ) ;  // 3/1/2013
LocalDate stop = LocalDate.of( 2013 , Month.JANUARY , 21 ) ; // 21/01/2013
今天的日期 时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

过去的日子 计算不同粒度的运行时间

long daysElapsed = ChronoUnit.DAYS.between( start , stop ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

使用JodaTime,这是一种使用此类库的简单工具;-)使用Joda-Time可以看到这一点。我如何才能将时间设置为17天并再次设置日期?因此,截至2014年1月21日,诸如
java.util.date
java.util.Calendar
、和
java.text.SimpleDateFormat
等令人烦恼的旧日期时间类现在已经遗留下来,被这些类所取代。大部分java.time功能都在项目中向后移植到Java6和Java7。进一步适应项目中早期的Android。请参阅。您可以使用两个日期之间的差(日历。月中日)。当差值超过1个月时,我返回的天数错误。是的,这只适用于sa内的天数
LocalDate start = LocalDate.of( 2013 , Month.JANUARY , 3 ) ;  // 3/1/2013
LocalDate stop = LocalDate.of( 2013 , Month.JANUARY , 21 ) ; // 21/01/2013
ZoneId z = ZoneId.of( "America/Montreal" ) ;  // Or `ZoneId.systemDefault()` to indicate explicitly that you want the JVM’s current default time zone. Beware of that default changing *during* runtime.
LocalDate today = LocalDate.now( z ) ;
long daysElapsed = ChronoUnit.DAYS.between( start , stop ) ;