Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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 目前如何接近时间[Android Studio]_Java_Android - Fatal编程技术网

Java 目前如何接近时间[Android Studio]

Java 目前如何接近时间[Android Studio],java,android,Java,Android,我有5次 例如: 凌晨4:21 12:1下午 下午3:32 下午6:30 晚上8:4 现在的时间是 上午10:4 我想做一个比较 下一次最接近当前时间的时间是什么 结果将是: 下次:12:1 PM您可以将时间转换为日期对象,然后转换为长时间(自1970年1月1日起的毫秒),并以毫秒为单位计算差值 long diffInMs = currentDate.getTime() - anotherDate.getTime(); 然后检查哪个差值最小,但也等于或大于零。负差表示旧日期,您需要下一个最近的

我有5次 例如:

凌晨4:21

12:1下午

下午3:32

下午6:30

晚上8:4

现在的时间是

上午10:4

我想做一个比较 下一次最接近当前时间的时间是什么

结果将是:


下次:12:1 PM

您可以将时间转换为日期对象,然后转换为长时间(自1970年1月1日起的毫秒),并以毫秒为单位计算差值

long diffInMs = currentDate.getTime() - anotherDate.getTime();
然后检查哪个差值最小,但也等于或大于零。负差表示旧日期,您需要下一个最近的日期

要将时间转换为日期,请选中此项:

基本上,它说:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

String inputString = "00:01:30.500";

Date date = sdf.parse("1970-01-01 " + inputString);

您可以将时间转换为日期对象,然后转换为长时间(自1970年1月1日以来的毫秒),并以毫秒为单位计算差值

long diffInMs = currentDate.getTime() - anotherDate.getTime();
然后检查哪个差值最小,但也等于或大于零。负差表示旧日期,您需要下一个最近的日期

要将时间转换为日期,请选中此项:

基本上,它说:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

String inputString = "00:01:30.500";

Date date = sdf.parse("1970-01-01 " + inputString);
更新:为午夜滚动添加了逻辑,并使用二进制搜索添加了替代方案

首先将输入解析为一天中以毫秒为单位的时间,将时间字符串解析为UTC时区

然后查找“当前”值上或之后的最小值,如果“当前”值上或之后没有值,则只查找最小值(滚动)

例如:

public static String findNext(String current, String... times) throws ParseException {
    SimpleDateFormat fmt = new SimpleDateFormat("hh:mm a");
    fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
    long currentMillis = fmt.parse(current).getTime();
    long bestMillis = 0, minMillis = 0;
    String bestTime = null, minTime = null;
    for (String time : times) {
        long millis = fmt.parse(time).getTime();
        if (millis >= currentMillis && (bestTime == null || millis < bestMillis)) {
            bestMillis = millis;
            bestTime = time;
        }
        if (minTime == null || millis < minMillis) {
            minMillis = millis;
            minTime = time;
        }
    }
    return (bestTime != null ? bestTime : minTime);
}
输出

12:1下午
上午4:21

如果保证已对给定时间进行排序,则可通过二进制搜索完成:

public static String findNext(String current, String... times) {
    SimpleDateFormat fmt = new SimpleDateFormat("hh:mm a");
    fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
    int idx = Arrays.binarySearch(times, current, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            try {
                return fmt.parse(s1).compareTo(fmt.parse(s2));
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
    });
    if (idx < 0)
        idx = -idx - 1;
    return times[idx < times.length ? idx : 0];
}
公共静态字符串findNext(字符串当前、字符串…次){
SimpleDataFormat fmt=新SimpleDataFormat(“hh:mm a”);
fmt.setTimeZone(TimeZone.getTimeZone(“UTC”));
int idx=Arrays.binarySearch(时间、当前、新比较器(){
@凌驾
公共整数比较(字符串s1、字符串s2){
试一试{
返回fmt.parse(s1).compareTo(fmt.parse(s2));
}捕获(解析异常){
抛出新的运行时异常(e);
}
}
});
if(idx<0)
idx=-idx-1;
返回次数[idx
更新:为午夜滚动添加了逻辑,并使用二进制搜索添加了替代方案

首先将输入解析为一天中以毫秒为单位的时间,将时间字符串解析为UTC时区

然后查找“当前”值上或之后的最小值,如果“当前”值上或之后没有值,则只查找最小值(滚动)

例如:

public static String findNext(String current, String... times) throws ParseException {
    SimpleDateFormat fmt = new SimpleDateFormat("hh:mm a");
    fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
    long currentMillis = fmt.parse(current).getTime();
    long bestMillis = 0, minMillis = 0;
    String bestTime = null, minTime = null;
    for (String time : times) {
        long millis = fmt.parse(time).getTime();
        if (millis >= currentMillis && (bestTime == null || millis < bestMillis)) {
            bestMillis = millis;
            bestTime = time;
        }
        if (minTime == null || millis < minMillis) {
            minMillis = millis;
            minTime = time;
        }
    }
    return (bestTime != null ? bestTime : minTime);
}
输出

12:1下午
上午4:21

如果保证已对给定时间进行排序,则可通过二进制搜索完成:

public static String findNext(String current, String... times) {
    SimpleDateFormat fmt = new SimpleDateFormat("hh:mm a");
    fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
    int idx = Arrays.binarySearch(times, current, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            try {
                return fmt.parse(s1).compareTo(fmt.parse(s2));
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
    });
    if (idx < 0)
        idx = -idx - 1;
    return times[idx < times.length ? idx : 0];
}
公共静态字符串findNext(字符串当前、字符串…次){
SimpleDataFormat fmt=新SimpleDataFormat(“hh:mm a”);
fmt.setTimeZone(TimeZone.getTimeZone(“UTC”));
int idx=Arrays.binarySearch(时间、当前、新比较器(){
@凌驾
公共整数比较(字符串s1、字符串s2){
试一试{
返回fmt.parse(s1).compareTo(fmt.parse(s2));
}捕获(解析异常){
抛出新的运行时异常(e);
}
}
});
if(idx<0)
idx=-idx-1;
返回次数[idx
我专门设计了一个函数来解决您的问题,可以根据需要使用函数

这肯定对你有用

/**
 *
 * @author Niravdas
 */
public class TimeDiff {
    String[] times = { "04:21 AM", "12:01 PM", "03:32 PM", "06:30 PM", "08:04 PM"};
    String findingafter="10:04 AM";

    public TimeDiff()
    {
        int time=nextTimeArrayIndex(findingafter,times);
        if(time>=0)
            System.out.println("NEXT TIME: "+times[time]);
    }

    public static void main(String argv[])
    {
        new TimeDiff();
    }
    int  nextTimeArrayIndex(String Finding,String[] fromArray)
    {
        int shortest=-1,shortestsec=-1;
        long minsecdif=(24*60*60+1),minsec=(24*60*60+1);
        int hr=Integer.parseInt(Finding.substring(0, 2));
        int min=Integer.parseInt(Finding.substring(3, 5));
        long seconds = convertToSec(hr, min, 0, Finding.substring(Finding.length()-2));
        System.out.println("seconds :" + seconds);
          for(int i=0;i<fromArray.length;i++)
          {
              int temphr=Integer.parseInt(fromArray[i].substring(0, 2));
              int tempmin = Integer.parseInt(fromArray[i].substring(3,5));
              long tempsec = convertToSec(temphr, tempmin, 0, fromArray[i].substring(Finding.length()-2));
              System.out.println("Compared to :" + tempsec);
              if((tempsec - seconds) > 0 && minsecdif > (tempsec - seconds))
              {
                  minsecdif = (tempsec - seconds);
                  shortest = i;
              }
              if(minsec > tempsec)
              {
                  minsec = tempsec;
                  shortestsec=i;
              }
          }
          if(shortest >=0)
          {
              return  shortest;
          }
          else
          {
              return  shortestsec;
          }


    }
    long convertToSec(int hr,int min,int sec,String AMorPM)
    {
        if(hr==12)
        {
               hr=0;
        }
        long secs = (hr*60*60) + (min*60) + (sec*60);
        if(AMorPM.equalsIgnoreCase("PM"))
        {
            secs += (12*60*60);
        }
        return secs;

    }     

}
/**
*
*@作者Niravdas
*/
公共类时间差{
字符串[]次={“04:21 AM”,“12:01 PM”,“03:32 PM”,“06:30 PM”,“08:04 PM”};
字符串查找时间=“10:04 AM”;
公共时间差()
{
int time=nextTimeArrayIndex(findingafter,times);
如果(时间>=0)
System.out.println(“下一次:+次[时间]);
}
公共静态void main(字符串argv[])
{
新的TimeDiff();
}
int nextTimeArrayIndex(字符串查找,字符串[]fromArray)
{
int shortest=-1,shortestsec=-1;
long minsecdif=(24*60*60+1),minsec=(24*60*60+1);
int hr=Integer.parseInt(Finding.substring(0,2));
intmin=Integer.parseInt(Finding.substring(3,5));
long seconds=convertToSec(hr,min,0,Finding.substring(Finding.length()-2));
System.out.println(“秒:+秒);
对于(inti=0;i0&&minsecdif>(tempsec-seconds))
{
minsecdif=(tempsec-秒);
最短=i;
}
如果(分钟>秒)
{
minsec=tempsec;
最短秒=i;
}
}
如果(最短>=0)
{
返回时间最短;
}
其他的
{
返回最短秒;
}
}
长转换秒(整数小时、整数分钟、整数秒、字符串时间)
{
如果(hr==12)
{
hr=0;
}
长秒=(小时*60*60)+(分钟*60)+(秒*60);
if(非对称等信号情况(“PM”))
{
秒+=(12*60*60);
}
返回秒数;
}     
}

我希望它能解决您的问题。

我专门设计了一个函数来解决您的问题,可以根据您的需要使用函数

这肯定对你有用

/**
 *
 * @author Niravdas
 */
public class TimeDiff {
    String[] times = { "04:21 AM", "12:01 PM", "03:32 PM", "06:30 PM", "08:04 PM"};
    String findingafter="10:04 AM";

    public TimeDiff()
    {
        int time=nextTimeArrayIndex(findingafter,times);
        if(time>=0)
            System.out.println("NEXT TIME: "+times[time]);
    }

    public static void main(String argv[])
    {
        new TimeDiff();
    }
    int  nextTimeArrayIndex(String Finding,String[] fromArray)
    {
        int shortest=-1,shortestsec=-1;
        long minsecdif=(24*60*60+1),minsec=(24*60*60+1);
        int hr=Integer.parseInt(Finding.substring(0, 2));
        int min=Integer.parseInt(Finding.substring(3, 5));
        long seconds = convertToSec(hr, min, 0, Finding.substring(Finding.length()-2));
        System.out.println("seconds :" + seconds);
          for(int i=0;i<fromArray.length;i++)
          {
              int temphr=Integer.parseInt(fromArray[i].substring(0, 2));
              int tempmin = Integer.parseInt(fromArray[i].substring(3,5));
              long tempsec = convertToSec(temphr, tempmin, 0, fromArray[i].substring(Finding.length()-2));
              System.out.println("Compared to :" + tempsec);
              if((tempsec - seconds) > 0 && minsecdif > (tempsec - seconds))
              {
                  minsecdif = (tempsec - seconds);
                  shortest = i;
              }
              if(minsec > tempsec)
              {
                  minsec = tempsec;
                  shortestsec=i;
              }
          }
          if(shortest >=0)
          {
              return  shortest;
          }
          else
          {
              return  shortestsec;
          }


    }
    long convertToSec(int hr,int min,int sec,String AMorPM)
    {
        if(hr==12)
        {
               hr=0;
        }
        long secs = (hr*60*60) + (min*60) + (sec*60);
        if(AMorPM.equalsIgnoreCase("PM"))
        {
            secs += (12*60*60);
        }
        return secs;

    }     

}
/**
*
*@作者Niravdas
*/
公共类时间差{
字符串[]次={“04:21 AM”,“12:01 PM”,“03:32 PM”,“06:30 PM”,“08:04 PM”};
字符串查找时间=“10:04 AM”;
公共时间差()
{
int time=nextTimeArrayIndex(findingafter,times);
如果(时间>=0)
System.out.println(“下一次:+次[时间]);
}
公共静态void main(字符串argv[])
{
新Ti