不是线程安全的容器

切片

array = [1, 2, 5, 3, 6, 8, 4]
array[0:] #列出0以后的 [1, 2, 5, 3, 6, 8, 4]
array[1:] #列出1以后的 [2, 5, 3, 6, 8, 4]
array[:-1] #列出-1之前的 [1, 2, 5, 3, 6, 8]
array[::2] # [1, 5, 6, 4]
array[2::] # [5, 3, 6, 8, 4]
array[::3] # [1, 3, 4]
array[::4] # [1, 6]
array[::-1] # [4, 8, 6, 3, 5, 2, 1]
array[::-2] # [4, 6, 5, 1]

# 间隔切片
list = [1,2,3,4,5,6]
n = len(list)
inter = 2 # 间隔
list_2 = list[0:n:inter]
阅读全文 »

时间复杂度 O(log n)

摘录至网络文章

O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表)
O(n) 意味着先要检查 n 个元素来搜索目标
O(log n) ??

阅读全文 »

字符串格式

SELECT xx,xx FROM t_xx WHERE f_devId = 10 and f_datetime >= '180211201449' and f_datetime <= '180211221449' ;

处理时间

TIMESTAMP_STRUCT * timeStruct = varValue.m_pdate;

equipInfo.dateTime = str::cstr::format("%04d-%02d-%02d %02d:%02d:%02d", timeStruct->year, timeStruct->month, timeStruct->day,
timeStruct->hour, timeStruct->minute, timeStruct->second);

DateTimeBox

使用中文包之后就会自动显示中文,并且按照年-月-日格式显示了

<script src="{{ url_for('static', filename='js/ext/jquery-3.2.1.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/ext/jquery.easyui.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/ext/easyui-lang-zh_CN.js') }}"></script>

设置时间

$("#startDate").datetimebox('setValue',lastActiveDate);

获取时间

var playStart = $('#startDate').datetimebox("getValue");
var playEnd = $('#endDate').datetimebox("getValue");

默认当前时间

function formatterDate(date) {
var day = date.getDate() > 9 ? date.getDate() : "0" + date.getDate();
var month = (date.getMonth() + 1) > 9 ? (date.getMonth() + 1) : "0"
+ (date.getMonth() + 1);
return date.getFullYear() + '/' + month + '/' + day;
};

$(function(){
$('.input_date').datebox('setValue', formatterDate(new Date()));
})

JavaScript提供2个方法在浏览器端储存数据:sessionStorage 和 localStorage。

sessionStorage:保存的数据用于浏览器的一次会话,当会话结束(通常是该窗口关闭),数据被清空;
localStorage:保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据。除了保存期限的长短不同,这两个对象的属性和方法完全一样。

sessionStorage 操作

sessionStorage.setItem("key","value");                 // setItem方法,存储变量名为key,值为value的变量
var valueSession = sessionStorage.getItem("key"); // getItem方法,读取存储变量名为key的值
sessionStorage.removeItem('key'); // removeItem方法,删除变量名为key的存储变量
sessionStorage.clear(); // clear方法,清除所有保存数据

localStorage 操作

localStorage.setItem("key","value");                   // 存储变量名为key,值为value的变量
localStorage.key = "value" // 同setItem方法,存储数据
var valueLocal = localStorage.getItem("key"); // 读取存储变量名为key的值
var valueLocal = localStorage.key; // 同getItem,读取数据
localStorage.removeItem('key'); // removeItem方法,删除变量名为key的存储变量
localStorage.clear(); // clear方法,清除所有保存的数据

// 利用length属性和key方法,遍历所有的数据
for(var i = 0; i < localStorage.length; i++)
{
console.log(localStorage.key(i));
}

// 存储 localStorage 数据为 Json 格式
value = JSON.stringify(jsonValue); // 将 JSON 对象 jsonValue 转化成字符串
localStorage.setItem("key", value); // 用 localStorage 保存转化好的的字符串

// 读取 localStorage 中 Json 格式数据
var value = localStorage.getItem("key"); // 取回 value 变量
jsonValue = JSON.parse(value); // 把字符串转换成 JSON 对象

storage 事件

当储存的数据发生变化时,会触发 storage 事件。我们可以指定这个事件的回调函数。

window.addEventListener("storage",onStorageChange);

回调函数接受一个event对象作为参数。这个event对象的key属性,保存发生变化的键名。

function onStorageChange(e)
{
console.log(e.key);
}

除了key属性,event对象的属性还有三个:

oldValue:更新前的值。如果该键为新增加,则这个属性为null。
newValue:更新后的值。如果该键被删除,则这个属性为null。
url:原始触发storage事件的那个网页的网址。

jeDate插件

var myDate = new Date();
// 日期插件
jeDate("#inputDate", {
format: "YYYY-MM-DD",
isTime: false,
minDate: "2014-09-19 00:00:00",
isinitVal:true,
initDate:[{YYYY:myDate.getFullYear(),MM:myDate.getMonth(),DD:myDate.getDate()},false],
})

获取当前日期

// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18

Date.prototype.Format = function (fmt) { // author: meizz
var o = {
"M+": this.getMonth() + 1, // 月份
"d+": this.getDate(), // 日
"h+": this.getHours(), // 小时
"m+": this.getMinutes(), // 分
"s+": this.getSeconds(), // 秒
"q+": Math.floor((this.getMonth() + 3) / 3), // 季度
"S": this.getMilliseconds() // 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}

字符串转时间对象

var sDate1 = "2008/04/02";
var oDate1 = new Date(sDate1);

时间减法

oDate1.setHours(oDate1.getHours() - 1);

//小时减法 subHours(start,1);
function subHours(start, subVal) {
return new Date(start.getTime() - subVal * 3600*1000);
}

日期时间对象格式化


/*
Based on Rick Strahl code
http://www.west-wind.com/weblog/posts/2008/Mar/18/A-simple-formatDate-function-for-JavaScript

Contributors:
Clauber Stipkovic - @clauberhalic
Mário Rinaldi - @MarioRinaldi

对Date的扩展,将 Date 转化为指定格式的String
月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
例子:
(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
(new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18

*/
Date.prototype.Format = function (format, utc) {
var date = this,
day = utc ? date.getUTCDate() : date.getDate(),
month = (utc ? date.getUTCMonth() : date.getMonth()) + 1,
year = utc ? date.getUTCFullYear() : date.getFullYear(),
hours = utc ? date.getUTCHours() : date.getHours(),
minutes = utc ? date.getUTCMinutes() : date.getMinutes(),
seconds = utc ? date.getUTCSeconds() : date.getSeconds();
if (!format) {
format = "MM/dd/yyyy";
}
format = format.replace("MM", month.toString().replace(/^(\d)$/, '0$1'));
if (format.indexOf("yyyy") > -1) {
format = format.replace("yyyy", year.toString());
} else if (format.indexOf("yy") > -1) {
format = format.replace("yy", year.toString().substr(2, 2));
}
format = format.replace("dd", day.toString().replace(/^(\d)$/, '0$1'));
if (format.indexOf("t") > -1) {
if (hours > 11) {
format = format.replace("t", "pm");
} else {
format = format.replace("t", "am");
}
}
if (format.indexOf("HH") > -1) {
format = format.replace("HH", hours.toString().replace(/^(\d)$/, '0$1'));
}
if (format.indexOf("hh") > -1) {
// if (hours > 12) {
// hours -= 12;
// }
// if (hours === 0) {
// hours = 12;
// }
format = format.replace("hh", hours.toString().replace(/^(\d)$/, '0$1'));
}
if (format.indexOf("mm") > -1) {
format = format.replace("mm", minutes.toString().replace(/^(\d)$/, '0$1'));
}
if (format.indexOf("ss") > -1) {
format = format.replace("ss", seconds.toString().replace(/^(\d)$/, '0$1'));
}
return format;
};

playStart = oDate1.Format("yyMMddhhmmss");
var aa= new Date().Format("yyyy-MM-dd hh:mm:ss");

var oDate1 = new Date(lastActiveDatetime);
var playEnd = oDate1.Format("yyMMddhhmmss", false);

timer


模态框表单自动获取焦点

$(document).ready(function () {
...
$('.modal').on('shown.bs.modal', function () {
$(this).find('[autofocus]').focus();
});
...
})

关闭事件

// 关闭重置
$('#procurementApplyAddModal').on('hidden.bs.modal', function () {
// # 可以设置下拉框为初始值
$("#quantityApply").val('');
// # 清空表单校验信息
$('#procurement_apply_record').datagrid('loadData', {"total":0,"rows":[]});
});

js显示模态框

// 解除绑定,show的时候会有重复绑定,导致重复触发。
$(this).off('shown.bs.modal');
 function openDevConfigModal(row) {
$('#devConfigTerminalCellphone').val(row.cellphone);
$("#devConfigPlateId").val(row.plate);

setTimeout(function () {
$('#devConfigModal').modal('show');
}, 230);
}

html代码

<!-- backdrop:避免点击空白自动关闭; 操作单个设备对话框,远程命令下发-->
<div class="modal fade " id="devOperateModal" aria-hidden="true" data-backdrop="static">
<div class="modal-dialog modal-lg animated">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title">远程操作设备</h2>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<div class="error"></div>

</div>
<div class="modal-footer">
<button type="button" id="btnDevRegSave" class="btn btn-primary">保&nbsp&nbsp&nbsp&nbsp存</button>
<button type="button" id="btnGenTerminalSms" class="btn btn-secondary" data-dismiss="modal">
生成终端配置短信
</button>
</div>
</div>
</div>
</div>

js提交表单

$("#btnDevRegSave").click(function (e) {
e.preventDefault();
var title = $('.modal-title').html();
var jsonData = $("#devRegForm").form2Json();
$.ajax(
{
url: "/admin/api/v1.0/devices",
method: "POST",
data: jsonData,
dataType: 'json',
contentType: "application/json; charset=utf-8",
success: function (data, textStatus, jqXHR) {
//data: return data from server
if (data['code'] == 0) {
// login success
hideLoginForm();
$(".profile").show();
$(".tpb-msg").hide();
// reload the user data
$('#dg').datagrid('reload');
// get dashboard page
//window.location.href = "dashboard";
} else {
shakeModal(data['msg']);
}
console.log(data, textStatus, jqXHR);
},
error: function (jqXHR, textStatus, errorThrown) {
//if fails
console.log(jqXHR, textStatus, errorThrown);
}
});
});

开自动挡的车只运用停车挡P挡、倒车挡R挡、空挡N挡、前进挡D挡完全可以满足一般驾驶的需要
D档—Drive:前进
P档—Park:停车
R档—Reverse:倒车
N档—Neutral:空档
N档一般用于等红灯,临时停车用;因为一旦挂入N档, 发动机的动力就不会被传递出去。
S档—Sport:运动
所以S档的低档位高转速有利于更灵敏的提速;
一般建议在超车或者飙车时使用。
L档—Low speed:低速档
手动挡强制挂入更低的档位可以在长下坡时利用发动机来减速;
那么L档其实作用是一样的,只出现在没有搭载陡坡缓降的车型上;