我为Angular应用程序创建了一个随机引用生成器。组件代码如下所示:
qotd = this.quotes[Math.floor(Math.random() * this.quotes.length)];
这是从这样的数据中提取出来的:
quotes = [
{
quote: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus euismod magna magna, euismod tincidunt libero dignis.",
author: 'Sorato Violasa'
},
{
quote: "Nullam dignissim accumsan magna vitae rhoncus. Phasellus euismod magna magna, euismod tincidunt libero dignis.",
author: 'Vito Dignaora'
},
{
quote: "In tincidunt imperdiet augue, quis sollicitudin mi tincidunt ut.",
author: 'Hivalo Amettioa'
},
{
quote: "hasellus accumsan erat vitae enim blandit, quis euismod ipsum sollicitudin.",
author: 'Grasha Plojiva'
},
];
然后在我看来我这样做:
<div class="quotes">
<p class="quote">
{{qotd.quote}} <br><br>
~ {{qotd.author}}
</p>
</div>
问题是,现在每次重新加载组件时都会生成一个新的引号,在单个会话中可以多次。我现在意识到更好的是将它作为日常报价生成器。因此,如果日期发生变化,它只会生成新的报价。实现这样的事情最简单的方法是什么?生成一周中的日期和星期很容易,如下所示:
date = new Date();
dayNumber = this.date.getDay();
但是,为了触发新实例,我如何计算星期几的变化?
答案 0 :(得分:1)
考虑一个服务器准备3个引号的方案:一个用于昨天,今天和明天。每个新的一天,昨天被删除,并添加了新的明天。这样,客户端的报价可以在客户当地时间午夜之后更改,并且每个人在同一个当地时间看到相同的报价。
地球上任何地方与UTC不同的时间超过14小时,因此如果服务器基于UTC的密钥,每个客户端都会有适当数量的报价,并且每次客户端都不会将整个报价数据库推送给每个客户端变化。
$update_result = $users->update_one(
{ 'userid' => $doc->{'userid'}},
{ '$set' => { 'emails.[0].active' => false }},
{ 'upsert' => 1}
);
&#13;
答案 1 :(得分:0)
不...等等... 如果您需要为每一天设置特定的报价,那是从报价列表中获取随机报价的不同场景,但在 eacb 24 hours, one day 上具有相同的报价。 如果您有一个数组,您可能会使用 rand 函数和一个计数来获取数组的值总数。 这将在每次加载时返回一个值。 因此,还有另一个名为 srand 的函数。 如果您使用 srand,您将设置一个种子 .. 并且该种子将成为 srand 的种子。
好的/
因此,种子设置 srand 结果......而 srand 进行随机化。 您也可以尝试 shuffle 功能。它也使用种子。
现在,您需要找到一个值用作种子,并且您需要该数字在 24 小时内发生变化。
要使用区间,需要一个参考值。可以使用服务器时间和用户代理时间。
如果您使用种子“42”,则 srand 返回的结果相同。
检查一下: 假设您有一个 42 个引号列表。 首先创建数组,设置种子变量,获取值。
$numbers = range(1,42); $seed = floor(time()/86400); 种子的值由服务器 unix 时间戳设置,其时区独立 (=UTC)。 根据需要间隔一天,使用 86400 值计算,一天的总秒数。 随机化数组 洗牌($数字); 并回显第一个结果。 让我们使用 200 个引号列表:
$quoteslist= range(1,200);
$seed = floor(time()/86400);
echo $seed;
$resultado = $quoteslist;
$seed = floor(time()/86400);
shuffle($resultado);
echo $resultado[$i];
time() 返回的值,时间戳,更改为 18846,即今天的种子。
然后,使用该值作为种子打乱列表。
得到第一个结果。
// you need find the array count. Lets create an array of a 200 quotes .
$quotes = range(1,200);
$seed = floor(time()/86400);
echo 'the seed is:'. $seed.' and that changes on next day .';
echo '<hr>';
// makes another range to use the same index
$quotes = range(1,200);
$resultado = $quotes;
// first value of the array, no randomizing (its 1)
echo 'the first result of the range array : ';
echo $resultado[0];
echo '<hr>';
// lets echo the result of the shuffle, not using the srand and the seed, it prints each time one value .
$quotes = range(1,200);
$resultado = $quotes;
shuffle($resultado);
echo 'first result of thhe array, shuffled.. but not using the seed: ';
echo $resultado[0];
echo '<br> this changes each refresh';
echo " <hr> ";
// this prints a random number for each day, basing on using the seed
$quotes = range(1,200);
$resultado = $quotes;
echo 'today: ';
$seed = floor(time()/86400);
srand($seed);
shuffle($resultado);
echo $resultado[0];
echo " * this changes everyday, same result for all reloads <hr> ";
echo '<br>';
// this is the seed of today. using
$quotes = range(1,200);
$resultado = $quotes;
echo 'the day of seed 18846: first day - result never changes, because used specific seed : ';
srand(18846);
shuffle($resultado);
echo $resultado[0];
echo " <hr> ";
echo 'the result for 18847 seed , next day - never changes : ';
$quotes = range(1,200);
$resultado = $quotes;
// this is 2 days after
srand(18847);
shuffle($resultado);
echo $resultado[0];
答案 2 :(得分:-1)
您可以采取的一种方法是通过localStorage
将当天保存在客户端上。在您的组件中,检查我们的localStorage中是否有currentDay
密钥,如果没有创建它,请保存对象内的currentDay
值和qotd
。
下次重新加载组件时,您应该已经在localStorage中分配了一个qotd,所以我们要做的是检查localstorage中保存的日期以及我们生成的当前日期。如果他们不同,我们知道这一天已经改变了。
//PSUEDOCODE (haven't tested, but should give you a good idea)
function(){
this.qotd = this.quotes[Math.floor(Math.random() * this.quotes.length)];
if(!window.localStorage.getItem('todayDate')){
let currentDay = new Date().getDay();
let storageItem = JSON.stringify({
currentDay,
qotd: this.qotd
})
window.localStorage.setItem('currentDay',storageItem)
}
else {
var existingQOTD = JSON.parse(window.localStorage.getItem('todayDate'));
let currentDay = new Date().getDay();
if(existingQOTD.currentDay !== currentDay){
let storageItem = JSON.stringify({
currentDay,
qotd: this.qotd
})
window.localStorage.setItem('currentDay', storageItem)
}
}
}