I am trying to use the days[] filter operator to determine whether my 
custom "scheduled" date field is in the past.  I have found that the days[] 
operator works inconsistently with and without an argument.

   - When days interval is positive,days[+N] returns "FALSE" when the date 
   field is more than N days in the future and "TRUE" when the date field is 
   within N days from today in the future *or in the past.*
   - When days interval is negative, days[-N] returns "FALSE" when the date 
   field is more than N days in the past and "TRUE" when the date field is 
   within N days from today in the past *or in the future.*
   - But when the days interval is 0, days[] returns "TRUE" only when the 
   date field is set to TODAY.  It returns "FALSE" for both future and past 
   dates.  This works to determine whether the date field is within 0 days 
   from today in the past, but this is incorrect for the future dates.

I'm still not sure if it's a bug or a feature.  So, the days[] filter can 
be used whether a date field is past N days in the future or N days in the 
past, but it cannot be used to determine whether a date is past 
TODAY because it returns FALSE for both future and past dates when days 
interval is 0.

I suppose this behavior went unnoticed because the filter is mostly used 
with "modified" and "created" fields which are always in the past.

I could not understand where the inconsistency in days.js comes from. 
 Perhaps, when "sigh" is 0, it is unclear whether it is 0 days in the 
future or 0 days in the past.

To solve my problem, I created my own filter "passed.js" by stripping down 
"days.js".  "passed.js" simply returns "TRUE" when the date field is in the 
past and "FALSE" when it is in the future.  I do not use setHours(0,0,0,0) 
there, so it takes time into account as well.  It might be a useful filter 
to add to TW5 permanently.

/*\
  title: $:/core/modules/filters/passed.js
  type: application/javascript
  module-type: filteroperator

  Filter operator that selects tiddlers with a specified date field in the 
past.

  \*/
(function(){

    /*jslint node: true, browser: true */
    /*global $tw: false */
    "use strict";

    /*
      Export our filter function
    */
    exports.passed = function(source,operator,options) {
var results = [],
   fieldName = operator.suffix || "modified",
   isInThePast = function(dateField) {
return new Date(dateField) < new Date();
   };

if(operator.prefix === "!") {
   source(function(tiddler,title) {
if(tiddler && tiddler.fields[fieldName]) {
   if(!isInThePast($tw.utils.parseDate(tiddler.fields[fieldName]))) {
results.push(title);
   }
}
   });
} else {
   source(function(tiddler,title) {
if(tiddler && tiddler.fields[fieldName]) {
   if(isInThePast($tw.utils.parseDate(tiddler.fields[fieldName]))) {
results.push(title);
   }
}
   });
}
return results;
    };

})();



-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/tiddlywiki.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/77a66873-159a-4424-9fdd-489e66697d1c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to