查找时间是否在时区约束的时间范围内

时间:2018-06-11 14:24:06

标签: android date time timezone

我正在编写一个Android应用程序,我需要知道商店是否在特定时间范围内打开。我已经使用下面的代码了:

try {
        Date time1 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.opening_time));
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(time1);

        Date time2 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.closing_time));
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(time2);
        calendar2.add(Calendar.DATE, 1);


        Date current = new SimpleDateFormat("HH:mm:ss").parse(getCurrentTime());
        Calendar calendar3 = Calendar.getInstance();
        calendar3.setTime(d);
        calendar3.add(Calendar.DATE, 1);

        Date x = current.getTime();
        if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
            isOpened = true;
        }
    } catch (ParseException e) {
        e.printStackTrace();
    } finally {
        return isOpened;
    }

此代码的问题在于他没有考虑时区。

time1和time2分别是开启和关闭时间,它们基于PST时区。现在它们的定义如下:

<string name="opening_time">06:00:00</string>
<string name="closing_time">18:00:00</string>

它们基于24小时格式而未指定时区。由于开放时间总是基于相同的时区,我可以根据需要以编程方式进行设置。

如果商店处于打开状态并考虑时区,我该如何使其正常回复true或false。由于我的商店从太平洋标准时间早上6点到下午6点开放,如果有人试图在美国东部时间晚上8点进入,那应该是好的。

我对API 19的支持率最低

由于

2 个答案:

答案 0 :(得分:0)

如果您设置时间 UTC ,则所有时区的时间都相同 尝试这样的事情:

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

答案 1 :(得分:0)

最简单的方法是将整个计算保留在商店的时区中,这样您就不需要在时区之间进行任何转换:

// POST: Fabric/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "FabricId,MainCategory,MainCategoryId, SubCategory1Id,SubCategory1,SubCategory2,Name,ImagePath,Location,Type,Weight,Content,Design,Brand,Quantity,Width,Source,Notes,ItemsSold")] Fabric fabric, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                var filename = Path.GetFileName(file.FileName);
                string fabricId = fabric.FabricId.ToString();
                string myfile = fabricId + "_" + filename;
                var path = Path.Combine(Server.MapPath("~/images"), myfile);
                fabric.ImagePath = myfile;
                file.SaveAs(path);
                db.Fabrics.Add(fabric);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(fabric);
        }

我刚刚在计算机上运行此代码。当地时间(欧洲/哥本哈根时区)是21:31,相当于洛杉矶的12:31。该片段打印出来:

  

商店是否开放?真

只要设备时钟正确,代码就与设备时区无关。

我正在使用并推荐import org.threeten.bp.LocalTime; import org.threeten.bp.ZoneId; public class IsStoreInOtherTimeZoneOpen { public static void main(String[] args) { ZoneId storeTimeZone = ZoneId.of("America/Los_Angeles"); LocalTime openingTime = LocalTime.parse("06:00:00"); LocalTime closingTime = LocalTime.parse("18:00:00"); LocalTime nowInStore = LocalTime.now(storeTimeZone); boolean isOpen = nowInStore.isAfter(openingTime) && nowInStore.isBefore(closingTime); System.out.println("Is store open? " + isOpen); } } ,现代Java日期和时间API。

问题:我可以在Android API级别19上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(从API级别26,我被告知)现代API内置。在这种情况下,导入java.timejava.time.LocalTime(不是上面使用的java.time.ZoneId中的类)。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。我被告知要使用的依赖项是org.threeten.bp

链接