首页 开发编程 正文

php日历怎么输出 怎么给这个图片添加水印

你可能会用thinkphp快速模仿出一个网站,但是其实它的底层调用的还是php的函数和基本语法。当然如果非常短时间就要使用thinkphp开发一些简单应用,不建议在不会php的前提下就直接学习thinkphp,看到这个问题必须来怒答一波~用python爬虫爬便宜机票了解一下?该爬虫对特定目的地运行并执行带有浮动日期(首选日期前后最多三...

php日历怎么输出,不会php可以学thinkphp吗?

可以,但是非常不建议。因为这会让你的基础不牢固,你可能会用thinkphp快速模仿出一个网站,但是一些php的原理都会被你忽略掉。

php是一门web开发语言,而thinkphp是在这上面封装的框架。简单来说,thinkphp就是把常用的功能给你封装好,你可以自己调用,但是其实它的底层调用的还是php的函数和基本语法。

当然如果非常短时间就要使用thinkphp开发一些简单应用,也可以直接学习它,毕竟上手容易是php的一大特点。但是之后,你还是要去重新踏踏实实学习php基本语法,基本函数,它的常用功能,因为这些都是你深入理解框架的前提。

基本功是最简单的,但是也是最难的。我们常讲万变不离其中,这个中就是基本功。有了基本功,你可以很好地理解框架,更好地使用框架,而且你还可以自己开发框架,这些都是在你打好基础的前提下。

最后总结一下,不建议在不会php的前提下就直接学习thinkphp,基础永远都是最重要的,基本功是你攀登高峰的最好选择。

php怎么给这个图片添加日期和定位的水印?

使用HTML 的Canvas画图功能,把你的原图片作为背景图,然后你根据情况在某个位置添加日期还有定位水印,然后再合成一张新的图片,生成到指定位置。希望能帮到你!

用爬虫技术能做到哪些有趣的事情?

看到这个问题必须来怒答一波~用python爬虫爬便宜机票了解一下?

喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!

图源:

videoblocks.com

你喜欢旅行吗?

这个问题通常会得到一个肯定的答案,随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗?”也许话题就到此为止了……

可事实上,便宜的机票往往也很重要!本文将尝试构建一个网络爬虫,该爬虫对特定目的地运行并执行带有浮动日期(首选日期前后最多三天)的航班价格搜索。它会将结果保存为excel文件并发送一封包含快速统计信息的电子邮件。显然,这个爬虫的目的就是帮助我们找到最优惠的价格!

你可以在服务器上运行脚本(一个简单的Raspberry Pi就可以),每天运行一到两次。结果会以邮件形式发送,建议将excel文件存入Dropbox文件夹,以便随时随地查看。

因为爬虫以“浮动日期”进行搜索,所以它会搜索首选日期前后最多三天的航班信息。尽管该脚本一次仅运行一对目的地,但可以很容易地改写该爬虫使其每个循环运行多个目的地。最终甚至可能找到一些错误票价...那会很有意思!

另一个爬虫

某种意义上来讲,网络爬取是互联网“工作”的核心。

也许你认为这是一个十分大胆的说法,但谷歌就是从拉里·佩奇用Java和Python构建的网络爬虫开始的。爬虫不断地爬取信息,整个互联网都在试图为所有问题提供最佳的可能答案。网络爬取有不计其数的应用程序,即使更喜欢数据科学中的其他分支,你仍需要一些爬取技巧以获得数据。

这里用到的一些技术来自于最近新的一本佳作《Python网络数据采集》,书中包含与网络爬取相关的所有内容,并提供了大量简例和实例。甚至有一个特别有意思的章节,讲述如何解决验证码检验的问题。

Python的拯救

第一个挑战就是选择爬取信息的平台,本文选择了客涯(Kayak)。我们试过了Momondo, 天巡(Skyscanner), 亿客行(Expedia)和其它一些网站,但是这些网站上的验证码特别变态。

在那些“你是人类吗?”的验证中,尝试了多次选择交通灯、十字路口和自行车后,客涯似乎是最好的选择,尽管短时间内加载太多页面它会跳出安全检查。

我们设法让机器人每4到6个小时查询一次网站,结果一切正常。虽然说不定哪个部分偶尔会出点小问题,但是如果收到验证码,既可以手动解决问题后启动机器人,也可以等待几小时后的自动重启。

如果你是网络爬取新手,或者不知道为何有些网站花费很大力气阻止网络爬取,那么为构建爬虫写下第一行代码前,你一定要多加努力。

谷歌的“网络爬取规范”:

http://lmgtfy.com/?q=web+scraping+etiquette

系紧安全带...

导入并打开Chrome浏览器标签页后,会定义一些循环中会用到的函数。这个架构的构思大概是这样的:

· 一个函数用于启动机器人程序,表明想要搜索的城市和日期。

· 这个函数获得首轮搜索结果,按“最佳”航班排序,然后点击“加载更多结果”。

· 另一个函数会爬取整个页面,并返回一个dataframe数据表。

· 随后重复步骤2和步骤3,得出按“价格”和“航行时间”排序的结果。

· 发送一封简要总结价格(最低价和平均价)的邮件,并将带有这三种排序类型的dataframe数据表保存为一份excel文件。

· 以上所有步骤会在循环中重复,每X小时运行一次。

每个Selenium项目都以一个网页驱动器开始。我们使用Chromedriver驱动器,但还有其它选择。PhantomJS和Firefox也很受欢迎。下载Chromedriver后,将其置于一个文件夹中即可。第一行代码会打开一个空白Chrome标签页。

from time import sleep, strftime

from random import randint

import pandas as pd

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import smtplib

from email.mime.multipart import MIMEMultipart

# Change this to your own chromedriver path!

chromedriver_path = 'C:/{YOUR PATH HERE}/chromedriver_win32/chromedriver.exe'

driver = webdriver.Chrome(executable_path=chromedriver_path) # This will open the Chrome window

sleep(2)

这些是将用于整个项目的包。使用randint函数令机器人在每次搜索之间随机睡眠几秒钟。这对任何一个机器人来说都是必要属性。如果运行前面的代码,应该打开一个Chrome浏览器窗口,机器人会在其中导航。

一起来做一个快速测试:在另一个窗口上访问客涯网(http://kayak.com),选择往返城市和日期。选择日期时,确保选择的是“+-3天”。由于在编写代码时考虑到了结果页面,所以如果只想搜索特定日期,很可能需要做一些微小的调整。

点击搜索按钮在地址栏获取链接。它应该类似于下面所使用的链接,将变量kayak定义为url,并从网页驱动器执行get方法,搜索结果就会出现。

无论何时,只要在几分钟内使用get命令超过两到三次,就会出现验证码。实际上可以自己解决验证码,并在下一次验证出现时继续进行想要的测试。从测试来看,第一次搜索似乎一直没有问题,所以如果想运行这份代码,并让它在较长的时间间隔后运行,必须解决这个难题。你并不需要十分钟就更新一次这些价格,对吧?

每个XPath都有陷阱

到目前为止,已经打开了一个窗口,获取了一个网站。为了开始获取价格和其他信息,需要使用XPath或CSS选择器,我们选择了XPath。使用XPath导航网页可能会令人感到困惑,即使使用从inspector视图中直接使用“复制XPath”,但这不是获得所需元素的最佳方法。有时通过“复制XPath”这个方法获得的链接过于针对特定对象,以至于很快就失效了。《Python网络数据采集》一书很好地解释了使用XPath和CSS选择器导航的基础知识。

接下来,用Python选择最便宜的结果。上面代码中的红色文本是XPath选择器,在网页上任意一处右键单击选择“inspect”就可以看到它。在想要查看代码的位置,可以再次右键单击选择“inspect”。

为说明之前所观察到的从“inspector”复制路径的缺陷,请参考以下差异:

1 # This is what the copymethod would return. Right click highlighted rows on the right side and select “copy> Copy XPath”//*[@id=“wtKI-price_aTab”]/div[1]/div/div/div[1]/div/span/span

2 # This is what I used todefine the “Cheapest” buttoncheap_results= ‘//a[@data-code = “price”]’

第二种方法的简洁性清晰可见。它搜索具有data-code等于price属性的元素a。第一种方法查找id等于wtKI-price_aTab的元素,并遵循第一个div元素和另外四个div和两个span。这次……会成功的。现在就可以告诉你,id元素会在下次加载页面时更改。每次页面一加载,字母wtKI会动态改变,所以只要页面重新加载,代码就会失效。花些时间阅读XPath,保证你会有收获。

不过,使用复制的方法在不那么“复杂”的网站上工作,也是很好的!

基于以上所展示的内容,如果想在一个列表中以几个字符串的形式获得所有搜索结果该怎么办呢?其实很简单。每个结果都在一个对象中,这个对象的类是“resultWrapper”。获取所有结果可以通过像下面这样的for循环语句来实现。如果你能理解这一部分,应该可以理解接下来的大部分代码。它基本上指向想要的结果(结果包装器),使用某种方式(XPath)获得文本,并将其放置在可读对象中(首先使用flight_containers,然后使用flight_list)。

前三行已展示在图中,并且可以清楚地看到所需的内容,但是有获得信息的更优选择,需要逐一爬取每个元素。

准备起飞吧!

最容易编写的函数就是加载更多结果的函数,所以代码由此开始。为了在不触发安全验证的前提下最大化所获取的航班数量,每次页面显示后,单击“加载更多结果”。唯一的新内容就是所添加的try语句,因为有时按钮加载会出错。如果它对你也有用,只需在前面展示的start_kayak函数中进行简要注释。

# Load more results to maximize the scraping

def load_more():

try:

more_results = '//a[@class = “moreButton”]'

driver.find_element_by_xpath(more_results).click()

# Printing these notes during the program helps me quickly check what it is doing

print('sleeping…..')

sleep(randint(45,60))

except:

pass

现在,经过这么长的介绍,已经准备好定义实际爬取页面的函数。

我们编译了下一个函数page_scrape中的大部分元素。有时这些元素会返回列表插入去程信息和返程信息之间。这里使用了一个简单的办法分开它们,比如在第一个 section_a_list和section_b_list变量中,该函数还返回一个flight_df数据表。所以可以分离在不同分类下得到的结果,之后再把它们合并起来。

def page_scrape():

“““This function takes care of the scraping part”““

xp_sections = '//*[@class=“section duration”]'

sections = driver.find_elements_by_xpath(xp_sections)

sections_list = [value.text for value in sections]

section_a_list = sections_list[::2] # This is to separate the two flights

section_b_list = sections_list[1::2] # This is to separate the two flights

# if you run into a reCaptcha, you might want to do something about it

# you will know there's a problem if the lists above are empty

# this if statement lets you exit the bot or do something else

# you can add a sleep here, to let you solve the captcha and continue scraping

# i'm using a SystemExit because i want to test everything from the start

if section_a_list == []:

raise SystemExit

# I'll use the letter A for the outbound flight and B for the inbound

a_duration = []

a_section_names = []

for n in section_a_list:

# Separate the time from the cities

a_section_names.append(''.join(n.split()[2:5]))

a_duration.append(''.join(n.split()[0:2]))

b_duration = []

b_section_names = []

for n in section_b_list:

# Separate the time from the cities

b_section_names.append(''.join(n.split()[2:5]))

b_duration.append(''.join(n.split()[0:2]))

xp_dates = '//div[@class=“section date”]'

dates = driver.find_elements_by_xpath(xp_dates)

dates_list = [value.text for value in dates]

a_date_list = dates_list[::2]

b_date_list = dates_list[1::2]

# Separating the weekday from the day

a_day = [value.split()[0] for value in a_date_list]

a_weekday = [value.split()[1] for value in a_date_list]

b_day = [value.split()[0] for value in b_date_list]

b_weekday = [value.split()[1] for value in b_date_list]

# getting the prices

xp_prices = '//a[@class=“booking-link”]/span[@class=“price option-text”]'

prices = driver.find_elements_by_xpath(xp_prices)

prices_list = [price.text.replace('$','') for price in prices if price.text != '']

prices_list = list(map(int, prices_list))

# the stops are a big list with one leg on the even index and second leg on odd index

xp_stops = '//div[@class=“section stops”]/div[1]'

stops = driver.find_elements_by_xpath(xp_stops)

stops_list = [stop.text[0].replace('n','0') for stop in stops]

a_stop_list = stops_list[::2]

b_stop_list = stops_list[1::2]

xp_stops_cities = '//div[@class=“section stops”]/div[2]'

stops_cities = driver.find_elements_by_xpath(xp_stops_cities)

stops_cities_list = [stop.text for stop in stops_cities]

a_stop_name_list = stops_cities_list[::2]

b_stop_name_list = stops_cities_list[1::2]

# this part gets me the airline company and the departure and arrival times, for both legs

xp_schedule = '//div[@class=“section times”]'

schedules = driver.find_elements_by_xpath(xp_schedule)

hours_list = []

carrier_list = []

for schedule in schedules:

hours_list.append(schedule.text.split('\n')[0])

carrier_list.append(schedule.text.split('\n')[1])

# split the hours and carriers, between a and b legs

a_hours = hours_list[::2]

a_carrier = carrier_list[1::2]

b_hours = hours_list[::2]

b_carrier = carrier_list[1::2]

cols = (['Out Day', 'Out Time', 'Out Weekday', 'Out Airline', 'Out Cities', 'Out Duration', 'Out Stops', 'Out Stop Cities',

'Return Day', 'Return Time', 'Return Weekday', 'Return Airline', 'Return Cities', 'Return Duration', 'Return Stops', 'Return Stop Cities',

'Price'])

flights_df = pd.DataFrame({'Out Day': a_day,

'Out Weekday': a_weekday,

'Out Duration': a_duration,

'Out Cities': a_section_names,

'Return Day': b_day,

'Return Weekday': b_weekday,

'Return Duration': b_duration,

'Return Cities': b_section_names,

'Out Stops': a_stop_list,

'Out Stop Cities': a_stop_name_list,

'Return Stops': b_stop_list,

'Return Stop Cities': b_stop_name_list,

'Out Time': a_hours,

'Out Airline': a_carrier,

'Return Time': b_hours,

'Return Airline': b_carrier,

'Price': prices_list})[cols]

flights_df['timestamp'] = strftime(“%Y%m%d-%H%M”) # so we can know when it was scraped

return flights_df

尽量让这些名字容易理解。记住变量a表示旅行的去程信息,变量b表示旅行的返程信息。接下来说说下一个函数。

等等,还有什么吗?

截至目前,已经有了一个能加载更多结果的函数和一个能爬取其他结果的函数。本可以在此结束这篇文章,而你可以自行手动使用这些函数,并在浏览的页面上使用爬取功能。但是前文提到给自己发送邮件和一些其他信息的内容,这都包含在接下来的函数start_kayak中。

它要求填入城市名和日期,并由此打开一个kayak字符串中的地址,该字符串直接跳转到“最佳”航班结果排序页面。第一次爬取后,可以获取价格的顶部矩阵,这个矩阵将用于计算平均值和最小值,之后和客涯(Kayak)的预测结果(页面左上角)一同发送到邮件中。这是单一日期搜索时可能导致错误的原因之一,因其不包含矩阵元素。

def start_kayak(city_from, city_to, date_start, date_end):

“““City codes it's the IATA codes!

Date format YYYY-MM-DD”““

kayak = ('https://www.kayak.com/flights/' + city_from + '-' + city_to +

'/' + date_start + '-flexible/' + date_end + '-flexible?sort=bestflight_a')

driver.get(kayak)

sleep(randint(8,10))

# sometimes a popup shows up, so we can use a try statement to check it and close

try:

xp_popup_close = '//button[contains(@id,”dialog-close”) and contains(@class,”Button-No-Standard-Style close “)]'

driver.find_elements_by_xpath(xp_popup_close)[5].click()

except Exception as e:

pass

sleep(randint(60,95))

print('loading more.....')

# load_more()

print('starting first scrape.....')

df_flights_best = page_scrape()

df_flights_best['sort'] = 'best'

sleep(randint(60,80))

# Let's also get the lowest prices from the matrix on top

matrix = driver.find_elements_by_xpath('//*[contains(@id,”FlexMatrixCell”)]')

matrix_prices = [price.text.replace('$','') for price in matrix]

matrix_prices = list(map(int, matrix_prices))

matrix_min = min(matrix_prices)

matrix_avg = sum(matrix_prices)/len(matrix_prices)

print('switching to cheapest results…..')

cheap_results = '//a[@data-code = “price”]'

driver.find_element_by_xpath(cheap_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting second scrape…..')

df_flights_cheap = page_scrape()

df_flights_cheap['sort'] = 'cheap'

sleep(randint(60,80))

print('switching to quickest results…..')

quick_results = '//a[@data-code = “duration”]'

driver.find_element_by_xpath(quick_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting third scrape…..')

df_flights_fast = page_scrape()

df_flights_fast['sort'] = 'fast'

sleep(randint(60,80))

# saving a new dataframe as an excel file. the name is custom made to your cities and dates

final_df = df_flights_cheap.append(df_flights_best).append(df_flights_fast)

final_df.to_excel('search_backups//{}_flights_{}-{}_from_{}_to_{}.xlsx'.format(strftime(“%Y%m%d-%H%M”),

city_from, city_to,

date_start, date_end), index=False)

print('saved df…..')

# We can keep track of what they predict and how it actually turns out!

xp_loading = '//div[contains(@id,”advice”)]'

loading = driver.find_element_by_xpath(xp_loading).text

xp_prediction = '//span[@class=“info-text”]'

prediction = driver.find_element_by_xpath(xp_prediction).text

print(loading+'\n'+prediction)

# sometimes we get this string in the loading variable, which will conflict with the email we send later

# just change it to “Not Sure” if it happens

weird = '¯\\_(ツ)_/¯'

if loading == weird:

loading = 'Not sure'

username = 'YOUREMAIL@hotmail.com'

password = 'YOUR PASSWORD'

server = smtplib.SMTP('smtp.outlook.com', 587)

server.ehlo()

server.starttls()

server.login(username, password)

msg = ('Subject: Flight Scraper\n\n\

Cheapest Flight: {}\nAverage Price: {}\n\nRecommendation: {}\n\nEnd of message'.format(matrix_min, matrix_avg, (loading+'\n'+prediction)))

message = MIMEMultipart()

message['From'] = 'YOUREMAIL@hotmail.com'

message['to'] = 'YOUROTHEREMAIL@domain.com'

server.sendmail('YOUREMAIL@hotmail.com', 'YOUROTHEREMAIL@domain.com', msg)

print('sent email…..')

虽然没有使用Gmail账户测试发送邮件,但是可以搜索到很多的替代方法,前文提到的那本书中也有其他方法来实现这一点。如果已有一个Hotmail账户,只要替换掉个人的详细信息,它就会开始工作了。

如果想探索脚本的某一部分正在做什么,可以将脚本复制下来并在函数外使用它。这是彻底理解它的唯一方法。

利用刚才创造的一切

在这些步骤之后,还可以想出一个简单的循环来使用刚创造的函数,同时使其持续运行。完成四个“花式”提示,写下城市和日期(输入)。因为测试时不想每次都输入这些变量,需要的时候可以使用以下这个清楚的方式进行替换。

如果已经做到了这一步,恭喜你!改进还有很多,比如与Twilio集成,发送文本消息而不是邮件。也可以使用VP*或更加难懂的方式同时从多个服务器上研究搜索结果。还有就是验证码的问题,验证码会时不时地跳出来,但对此类问题还是有解决办法的。不过,能走到这里已经是有很牢固的基础了,你可以尝试添加一些额外的要素。

使用脚本运行测试的示例

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

有哪些好用的软件值得推荐?

推荐一些专业性较强的国产软件,办公族和学生党都能用得上,肯定会帮助到你:1、格式工厂

用来快速进行视频、音频剪辑的软件,当然除了音频视频,格式工厂还能对gif等多媒体格式文件进行制作和转换,主要优点就是比较简单,基本不需要教程,自己琢磨一会就知道怎么用了,

让我感到意外的是,格式工厂还可以修复损坏的文件,如果你在转化的时候发现这个视频已经损坏了,格式工厂可以进行修复,真的基本比很多修复工具强(对,你知道我说的是谁)

比较常用的主要功能是视频转换、音频转换、图片转换、视频合并、抓取DVD到视频文件、抓取音乐CD到音频文件等等,比较万能,强烈推荐。

2、向日葵

向日葵远程控制是一款支持多平台的远程控制软件,最近因为疫情的原因我用的比较多,能够在安卓、ios、win和mac这些平台之间互相远程控制,如果你发现你不能去公司的时候,就可以用家里的win电脑控制公司里的mac。

这个国产软件比较经验的地方就在于各种远程功能的控制上,比如我经常用手机远程控制电脑进行文件编辑,从此我就再也没用过USB拷文件了,尤其是手机和电脑不在一个地方的时候,真的是很方便,强雷推荐。

3、截图工具 Snipaste

Snipaste 是一个截图 + 贴纸软件,可以很方便地用它截图并编辑。

根据鼠标的移动,它可以自动选择界面的元素,还支持多屏。它还有强大的标注功能,丰富的画图工具,像矩形,圆形,线条,马克笔。还能打马赛克,高斯模糊,还有拾色功能。

可以随意选择复制剪切文字,它能自动转换为图片,它支持文本,HTML,颜色等等。

还有自动备份恢复功能。

4、思维导图工具Xmind@XMind思维导图是一个特别好用的思维导图软件,而且是国产的,给长脸了。

它专有的思维导图引擎,展示效果更好,丰富的绘图元素。同时多种精美的主题供你选择。

多种优质字体,支持Markdown,还有原创贴纸。

它的多个版本完全兼容,支持PDF和印象笔记导出。

它有专业版的Xmind Pro,免费电脑版的Xmind Zen,还有iOS 专有版,可以根据自己的喜好选择不同的版本。

5、字体管理软件-字由

近几年设计界涌现了几款备受关注的字体,比如思源黑体、思源宋体等等,但如果用户只是希望在一些特定的软件上才会使用一些特定的字体时,专门去查找和安装各种类型的字体就略显繁杂,字由 的出现刚好解决这样的问题。

字由官网本身有大量的字体库、字体案例,还准备了多个不同风格的字体合集,而字由软件号称为设计师量身定做的字体工具,设计师可以通过收藏,搜索,标签,案例等快速找到心仪的字体,并在设计软件中无缝的使用这些字体。

无需安装,一键使用——这一特性是字由最大的亮点,用户在软件中找到心仪的字体后,只需要点击字体右侧的对勾图标,则可将字体下载并安装到电脑中,并且轻松将字体应用到相应的设计软件中,目前 Windows 平台支持 Photoshop、Illustrator、Coreldraw、Word、PowerPoint 软件直接调用不同的字体。

6、FineReport

这是一个商用报表软件,主要应用于企业级的办公上。比如业务系统报表,数据分析报表。可集成在OA,ERP,CRM内。主要两大核心是填报和数据展示。懂点java的话可以做开发,比如我同事用这个开发了一个公司内部的考试系统。

主要用途还是做报表,大数据量的报表和可视化。

类似excel制作报表,不用数据透视表,也不要写VBA,功能都是封装好的填报功能,收集数据审核入(数据)库简直无压力Dashboard(决策报表),表格立马变高大上的“驾驶舱”移动端报表随时随地看7、事件管理软件——滴答清单@滴答清单是一款用于时间管理和提升工作效率的软件 。用了这么多管理软件,听了很多时间管理的课程,我才意识到相比较不断地去做事情,还不如认真地去思考怎么做好事情?以及怎么利用好工具提高效率,工具要越简单越好,容易上手。

适用场景:每天睡前制定明天的计划,以便更好地管理自己的事务。

8、大纲笔记工具——幕布@幕布APP是一款结构化的大纲笔记,它是思维逻辑整理工具。它的好处:输入大纲笔记能一键转化为思维导图,查看起来清晰直观它还可以训练你的逻辑思维能力手机网站同步实时保存

适用场景:工作计划、工作汇报、演讲稿的整理、读书笔记、课程笔记、课程设计。

9、团队协作工具——有道云@有道云笔记属于协作文档工具,比较适合多人共同编辑、分写协作等场景。

有些内容需要共享的,比如一些账号,比如报告需要给我修改编辑的,可以协同编辑。还有一点是,工作需要带回家做,文件不大的话可以传有道云,当一个云工具使用了。不过一个月总有那么一两次奔溃不稳定。

关于文件安全,PC上可以装一个本地版,定时备份。

11、数据分析、可视化高效工具——FineBI

和上面finereport是兄弟工具,只不过前者主要针对商业报表开发,效率上可以替代传统人工excel统计;后者是BI,是数据分析工具,将数据呈现成可视化报告。

FineBI是一款BI商业智能工具,能简单快速的生成各种酷炫的可视化数据报表,做有目的性的数据分析。

最重要的一点,个人使用免费!

12、网盘工具——坚果云@坚果云是一款存储文件的网盘工具,文件同步可以在任何文件夹下操作,没有限制。坚果云的安全性相对百度网站好一些.

而相对于网盘,国内公开分享资料的网盘--百度云,它适合收集分享资料、视频、软件;但是它下载速度差,资料容易别和谐,分享的链接经常被屏蔽。

适用场景:储存文件、软件、视频。

暂时就先分享这些吧,待更新

php显示时间常用方法小结?

一、PHP函数Date()获取当前时间

代码如下:<?php echo $showtime=date("Y-m-d H:i:s");?>

显示的格式: 年-月-日 小时:分钟:秒

相关参数:

a:"am"或者"pm"

A:"AM"或者"PM"

d:几日,二位数字,若不足二位则前面补零,如: "01"至"31"

D:星期几,三个英文字母,如: "Fri"

F:月份,英文全名,如: "January"

h:12 小时制的小时,如: "01"至"12"

H:24 小时制的小时,如: "00"至"23"

g:12 小时制的小时,不足二位不补零,如: "1"至12"

G:24 小时制的小时,不足二位不补零,如: "0"至"23"

i:分钟,如: "00"至"59"

j:几日,二位数字,若不足二位不补零,如: "1"至"31"

l:星期几,英文全名,如:"Friday"

m:月份,二位数字,若不足二位则在前面补零;如: "01"至"12"

n:月份,二位数字,若不足二位则不补零;如:"1"至"12"

M:月份,三个英文字母;如:"Jan"

s:秒;如:"00"至"59"

S:字尾加英文序数,二个英文字母;如:"th"、"nd"

t:指定月份的天数;如:"28"至"31"

U:总秒数

w:数字型的星期几,如: "0"(星期日)至"6"(星期六)

Y:年,四位数字;如:"1999"

y:年,二位数字;如:"99"

z:一年中的第几天;如:"0"至"365"

二、PHP5中Date()函数获取时间相差8小时问题的解决方法

只需在输出时间之前加个定义:date_default_timezone_set("PRC");,代码:

<?php

date_default_timezone_set("PRC");

echo date("Y-m-d H:i:s");

?>

三、PHP获取文件创建时间和最后修改时间的函数

filemtime(string filename):返回文件上次被修改的时间,出错时返回false。时间以Unix时间戳的方式返回,可用于Date()。

filectime(string filename):返回文件上次inode被修改的时间,如果出错则返回false。时间以Unix时间戳的方式返回。

fileatime(string filename):返回文件上次被访问的时间,如果出错则返回false。时间以Unix时间戳的方式返回。

四、PHP比较两个日期相差天数

代码:

<?php

echo (strtotime("2008-08-24 00:00:00")-strtotime("2008-08-08 00:00:00"))/86400;

?>

本文转载自互联网,如有侵权,联系删除