自定义日期 .filter 仅在 iOS 中不显示日期 .split 方法方法

Posted

技术标签:

【中文标题】自定义日期 .filter 仅在 iOS 中不显示日期 .split 方法方法【英文标题】:custom date .filter does NOT show dates in iOS ONLY .split method approach 【发布时间】:2016-01-19 01:53:19 【问题描述】:

我们设法以客户希望的方式在我们的应用中显示日期。这对我们来说是一项艰巨的任务,但我们对结果感到满意。我们正在使用 Ionic 框架,仅在 iOS 设备和模拟器上出现以下错误。浏览器和 android 完美显示日期。

所以我从这里读到有些人对 .split 方法很幸运。我们将其添加到我们的代码中,但继续收到此错误,并且显示内容已损坏 ng-bind .. 这是来自 ios 的错误

E R R O R:convDate.split 不是函数。 (在'convDate.split('')'中,'convDate.split'是未定义的)

**Error: convDate.split is not a function. (In 'convDate.split(' ')', 'convDate.split' is undefined)**
file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/js/controllers/BookingsController.js:147:35
fn
regularInterceptedExpression@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:23059:37
expressionInputWatch@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:22961:42
$digest@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:24507:43
$apply@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:24783:31
done@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19196:53
completeRequest@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19368:15
requestLoaded@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19309:24
(anonymous function)console-via-logger.js:172
(anonymous function)ionic.bundle.js:21161
(anonymous function)ionic.bundle.js:17940
$digestionic.bundle.js:24532
$applyionic.bundle.js:24782
doneionic.bundle.js:19195
completeRequestionic.bundle.js:19367
requestLoadedionic.bundle.js:19308

我们的日期过滤器代码

  .filter('customDateFilter', function($filter) 
    return function(input) 
      var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'Novemeber', 'December'];
      var weekdays = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
          var convDate = $filter('date')(new Date(input), 'MMMM dd EEEE yyyy');
    var inputDate = convDate.split(' ');
      // SHOW "Today" on today's date instead of actual date O_o
      var showToday = new Date();

      if (convDate === ($filter('date')(new Date(showToday), 'MMMM dd EEEE yyyy')) return "TODAY";
      if (convDate !== ($filter('date')(new Date(showToday), 'MMMM dd EEEE yyyy')) 
        return inputDate[2] + " " + inputDate[0] + " " + inputDate[1];
      
    ;
  )

customeDate fiter 视图中的代码..

<span id="dates-fonts-styles">groupedBooking[0].driver_departing_time | customDateFilter</span>

对我们的预订进行分组的功能..(不确定是否有必要)

  function setBookingGroupDate(bookings) 
    //*2*Go through each booking
    for (var i = bookings.length - 1; i >= 0; i--) 
      var date = new Date(bookings[i].driver_departing_time); //*3*Create date from drvier_departing_date
      var dateWithoutHour = new Date(date.getFullYear(), date.getMonth(), date.getDate()); //*4* create same date but w/o the hr to minimize the differences
      var dateCode = dateWithoutHour.getTime(); //Get timeStamps to have same filed for all and same type to be able to order and GROUP
      bookings[i].groupByDateCode = dateCode; //add it back to respective booking[index]
    ;
    //Return the bookings
    return bookings;
  

从该代码返回的日期是 1 月 18 日星期一,依此类推.. 只有 iOS 向我们发送错误并显示 groupedBooking[0].driver_departing_time |视图上的 customDateFilter ..

有人知道是否有解决办法吗?我们尝试了 .split,基于这里的很多好感。

【问题讨论】:

表达式 inputDate === showToday 永远不会为真,因为 showToday 是一个 Date 对象,它只能是 === 自身,而 inputDate 是其他一些值。 input 的值是多少,因此new Date(input) 的结果是什么? 您在另一个答案下方回复了这些 cmets。这里的推论是 input 是一个字符串,并且您依赖 Date 构造函数在 new Date(input) 中解析它,这是 never 一个好主意。麻烦的平台可能不会解析字符串并返回无效的日期,因此$filter('date')(...) 不会返回您期望的字符串。您应该始终手动解析日期字符串(库可以提供帮助,但支持特定格式是 2 行代码)。 【参考方案1】:

我认为您可能需要将 convDate 变量显式类型转换为 String。将过滤日期代码更改为以下代码,看看是否有效:

.filter('customDateFilter', function($filter) 
    return function(input) 
      var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'Novemeber', 'December'];
      var weekdays = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
          var convDate = $filter('date')(new Date(input), 'MMMM dd EEEE yyyy');
    convDate = convDate.toString(); //Typecasting convDate to string.
    var inputDate = convDate.split(' '); 
      // SHOW "Today" on today's date instead of actual date O_o
      var showToday = new Date();

      if (inputDate === showToday) return "TODAY";
      if (inputDate !== showToday) 
        return inputDate[2] + " " + inputDate[0] + " " + inputDate[1];
      
    ;
  )

干杯,

【讨论】:

convDate.toString() 返回的值是entirely implementation dependent,除非 OP 指定了定制的 Date.prototype.toString 方法。否则,这取决于机会。 @RobG 是的 @Shoaib Raza 的建议没有奏效。 (谢谢你!)我发布了一些未完成的代码也是我的错误。 if (inputDate === showToday) return "TODAY"; if (inputDate !== showToday) 无论如何,当它返回时; return inputDate[2] + " " + inputDate[0] + " " + inputDate[1]; 它在浏览器和 Android 中运行良好,但在 iOS 中则不行。 @Shotbyabel——通过推论,inputDate !== showToday 将始终为真,所以您不妨忘记这两个 if 语句,只使用 return inputDate[2] ... @RobG ,if 语句未更新为当前工作代码(请忽略它们)问题是 return 语句不适用于 iOS。【参考方案2】:

有两件事可以尝试。 如果可以将convDate 类型转换为String,那么您可以尝试

convDate == showToday

双 ==(而不是三重 ===)为您进行类型转换。

或者你也可以尝试通过这个把convDate转成String

convDate = "" + convDate;

【讨论】:

以上是关于自定义日期 .filter 仅在 iOS 中不显示日期 .split 方法方法的主要内容,如果未能解决你的问题,请参考以下文章

Safari iOS 5 中不显示自定义 webfont 字符

在 IOS 5 中不显示颜色和数据

HTML:单引号在此网站上显示为空格,但仅在某些浏览器中显示(即在桌面上的 Chrome 中,但在 iOS 上的 Safari 中不显示)

自定义单选按钮在 iOS Safari 中不可见

iOS Button 在自定义视图中不起作用

故事板日期选择器中的选择性日期(iOS 开发)