A solution is the following:
long nowTimestamp = <compute now timestamp>;
long delta = 30 * 24 * 60 * 60 * 1000; // ms
var result = myModel.Where(item => nowTimestamp - item.CreationTimeInMs > delta);
However, this approach has a linear complexity (O(list_length)) and does not use the fact that it is sorted.
If the list is sorted descending you can just construct another list, as long as current timestamp is new enough:
var recentList = new List<FooModel>();
foreach (var item in myModel)
{
if (nowTimestamp - item.CreationTimeInMs > delta)
break;
recentList.Add(item);
}
This is the fastest approach, but requires the list to be ordered in a descending manner.
If the list comes in a ascending order, you must first find the item that is the last to be included. As already mentioned, the fastest way is to use a binary search approach, as indicated in this question.
Using provided index, you can get all subsequent elements:
int indexOfFirstElement = myModel.BinarySearchForMatch(item => item.CreationTimeInMs > nowTimestamp - delta);
var recentList = new List<FooModel>();
for (int i = indexOfFirstElement; i < myModel.Count; i ++)
{
recentList.Add(myModel[i]);
}
Binary search takes O(log(list_size)) and list construction is O(result_size).